System-on-Chip, and what it promises

First published on DNA here.

AT a recent dinner with several friends, I was asked what Snapdragon was. I was tempted to answer: “Trademark,” but decided against making that wisecrack. My friends had a vague idea that it had to do with the microprocessor in their phones, but was that not an ARM processor?

I think that some people out there might also be a little confused about it. Seeing that microprocessors are my little hobby, I tried to answer their question.

The technical term for the Qualcomm Snapdragon is a system-on-chip or system-on-a-chip (SoC). It is somewhat similar to products like the Apple A6, Samsung Exynos or TI OMAP devices also found in modern smartphone devices. There are a lot of SoC devices out there.

An SoC is essentially an electronic device that contains a number of other electronic devices that were traditionally found in separate chips that took up a lot of space on a circuit board. With the magic of modern technology, we can now integrate a lot of different functionality and powerful capabilities into a single silicon device.

Hence the term system-on-chip.

Integrating multiple chips into one saves on-board space that is already very limited in our increasingly smaller phones. This means that we can all look forward to having physically smaller devices as more and more functionality gets integrated into an SoC.

Furthermore, integration improves communication capacities between the different devices, keeping all circuit paths on-chip instead of on-board. Although electrons move very quickly, it still takes a finite amount of time for them to move from one place to another. So, shorter circuit paths will improve speeds and give us a better user experience.

In addition, integration also improves power consumption by having less circuitry overall. By squeezing everything onto a single chip and allowing all the different parts to communicate directly with each other, it reduces the amount of power needed for everything, which gives us better battery life.

Let us not forget that integration also means economies of scale and brings down the cost of manufacturing. Instead of manufacturing multiple devices using different technologies and processes, a fully integrated device could be manufactured at one time, using a single manufacturing process.

Therefore, SoCs are the way to smaller, faster and cheaper gadgets.

A typical SoC would contain one or more microprocessors with a number of other peripherals or devices all tightly integrated within it. These microprocessors do not even need to be of the same type or architecture, but are commonly so for convenience. Some makers couple big microprocessor cores with little cores in order to improve power efficiency.

It is not uncommon these days to find a modern smartphone with quad-core microprocessors and graphics processors integrated into the same SoC. This is where companies like ARM come in – to supply the microprocessors that power most mobile computing devices today.

A microprocessor is essentially the brains of all modern computing devices. But for a brain, it is actually pretty dumb. It is essentially an over-powered calculator, merely capable of performing billions of computations each second and moving bits of data around.

But through the modern sorcery of software, all this calculating and moving bits around actually give us our videos, music, games, the Internet and all other manner of modern entertainment, information and communication capabilities.

So, what about Intel?

Intel is definitely a major supplier of microprocessors, especially for the desktop, laptop and server markets. However, Intel microprocessors have traditionally been sold as standalone microprocessors and not fully integrated SoCs.

Only recently has Intel released a line of Atom-based SoC for use in smartphones and tablets, which has found use by several manufacturers. It is a late entry into the mobile phone market, which is the traditional stronghold of ARM microprocessors. This is the reason why most phones run on an ARM microprocessor.

So, how does all this change our lives?

Since nearly all mobile phone SoC use ARM microprocessors, their computational capabilities are fairly similar with all else being equal. However, the difference in the types of devices integrated into the SoC by different makers mean that different devices will have different features and capabilities.

However, unlike traditional PC markets, all this tight integration means that the consumer loses the option to mix-and-match capabilities. We cannot pick and choose different microprocessor, graphics, radio and other capabilities. Consumers are only left with using the set of capabilities that the device makers have decided to put in.

One does sometimes wonder if the world would be a different place if the smartphone market developed like the PC market – where one could assemble custom hardware and load it with any software they liked instead. Wouldn’t it be great if someone out there provided the tools for consumers to easily assemble their own SoC?

It seems that in our pursuit of having smaller, faster and cheaper devices, we may have sacrificed some personal freedom. If that does not matter, then it’s a non-issue.

But if it matters, supporting product ideas like Project Ara, Phonebloks and Neo900 would be a good start as it would tell device makers that consumers want more freedom. And to take things further, supporting open-source SoC efforts like ORPSoC, Milkymist and T3RAS would be even better.

Disclosure: Milkymist was originally powered by my AEMB2 microprocessor and T3RAS is the upcoming SoC from my company.

How to Learn Programming – Solo

This article first appeared on DNA.

In my previous article, although I asserted that programming cannot be taught, I did clearly state that it can definitely be learned. If you look at major role-models in the tech industry, you will find that many were self-taught programmers at some point in their lives.

Unlike a lot of other skills, programming is something that can definitely be learned on your own. I have friends who started while studying for their biology degree; while doing their bio-chemistry doctorate; or even while working as a full-time lawyer. So, it is never too late to start.

Nor would you ever be too young to start. I knew someone who started programming at the age of four. Such a person is obviously rare, but as a regular judge for national LEGO robotics competitions, I see primary school kids doing programming all the time.

It is my personal opinion that within my lifetime, I will see programming turn into a basic skill for everyone. As intelligent machines invade, we cannot help but to have at least some rudimentary programming skills to effectively get through our lives in the future.

So, where do we start?

That’s a question that I often hear from undergraduates. I was also recently asked by a young father on how he might be able to encourage his kids to do programming. Unlike in the past, we’re now living in an age where learning how to program is accessible at any age.

Some people may research the pros and cons of different languages to determine which to learn first. The truth of the matter is that the language does not matter in the larger scheme. Decent programmers know several languages. Just pick any language to start with and grow from there.

Learning a language is simple. There are far too many online courses and materials for every single language imaginable. The Learn X the Hard Way online materials for learning a language is a good way to jump right in for Python, Ruby and C.

For younger children, something a little less abstract may be preferable. Starting with Logo as they do in Vietnam may be a good choice, but something like Scratch, Stencyl, or Alice might be more suitable. For older children, Code Academy and Khan Academy provide a guided platform to learn programming.

As with everything else, the key to learning programming is to keep things fun.

Besides learning a language, it is also quite important to build up a solid foundation in computing fundamentals. There are plenty of online courses that are available as well. Some of the best universities in the world give away their courseware for free.

For example, there is the MIT Open Courseware series that covers a wide range of topics, including computing fundamentals. For the younger children, there is also CS Unplugged that tries to present abstract computing concepts in a simple to understand way.

In addition to learning theory to understand the fundamentals, and learning a language to express the ideas as something real; we would also need to have some real-life scenarios to apply all that learning. This is where many people get a little lost, as the areas of application are numerous and various.

An area of personal interest is as good a starting point as any. Some people like playing games. For these people, a good gateway into programming might be to write some simple games. From this starting point, we can grow into related areas.

It is important to start small while growing our skills and knowledge, one step at a time. There is no sense in being too ambitious and trying to create an Angry Birds clone on your first attempt. Writing a simple tic-tac-toe game would already involve a lot of hard work.

And hard work it will be, if we wish to master The Art of Computer Programming (a recommended read for the advance programmer). There will be a lot of pain when confounded with difficult problems, but a sense of elation awaits those who never surrender.

I would also recommend getting a low-cost Arduino kit or a LEGO Mindstorms set. Both these things allow us to quickly build and program devices that interact with the real-world, which brings programming to life. There are a lot of cool projects on the Internet to copy from.

On that note, copying is an excellent way to learn how to program. Trying to build something from nothing can be a bit daunting for the beginner programmer. There are so many open-source projects to be found online. Learning from real-world examples will really help us in applying theoretical skills.

Regardless of the path that we choose to embark on, learning how to program is an invaluable tool in this modern age. Learning how to program is a fruitful adventure, though it is a dangerous one that risks sucking us in and never letting us go.

In my next column, I will look at how programming in small groups actually helps us develop into better programmers. – See more at: http://www.digitalnewsasia.com/insights/how-to-learn-programming-solo#sthash.pPgJgVkF.dpuf

We Cannot Teach Programming

This article first appeared on DNA:

RECENTLY, I was asked by several people how come some Computer Science graduates are incapable of programming. There are anecdotes all over the Internet about how some Computer Science graduates cannot write even simple programs.

Now, some will argue that it is not the job of a computer scientist to write software programs as Computer Science is seen as a branch of mathematics, which is more theoretical than applied. While that may be true, coding is essential to realising the solutions and therefore, one must be capable of doing it.

Before I proceed further, I will state this up front – it is my opinion that programming is not something that can be taught. It is not a mechanical skill, but a creative art. I will even go one step further and say that it is impossible to teach someone the ability to be a good programmer.

Some may agree with me and some may not. Some may think me elitist for taking this position and some may even accuse me of being hypocritical. As usual, my opinions are my own and I have my reasons for saying this.

If we look at the body of knowledge that is required in our computing curricula as defined by the MQA (Malaysian Qualifications Agency), it covers areas such as computer architecture, databases, mathematics, data communication, operating systems, programming fundamentals, and software analysis and design.

If we zoom into Computer Science curricula, they go into specific areas such as algorithms, programming languages, human-computer interaction, graphics, intelligent systems, social issues, software engineering and computational science.

In practice, university programmes typically teach at least one programming language and make their students write programs for projects and assignments. There are also many references available on learning a language in 24 hours or 21 days, along with even more websites and tutorials.

However, the flaw with this assumption is that knowledge of a programming language equals the capability to code.

This is absolutely not true. Just like how knowledge of English does not magically make the person a poet, mere knowledge of Java won’t make a person a programmer.

Schools can teach programming languages. Every graduate lists several programming languages in their CV these days. When interviewed, some may even be capable of describing what each line of code does. However, few are capable of telling you what the application actually does.

Schools can also teach structure. Some graduates can describe the differences between iteration and recursion, or talk about the many virtues of a hash-table versus a binary-tree. However, few can tell you what is wrong with the way data is organised and how it should be used in an application.

All this point to one fact: That the ability to program is more than just a collection of language and structural knowledge.

A programmer must be capable of grasping complexity while, at the same time, pay great attention to detail. It requires one to be capable of holding the whole of Michelangelo’s David in the head while chiselling away at an individual vein on one finger.

This kind of mental acrobatics is not something that simply anyone is capable of doing, nor is it possible to train someone to do it if they do not have the in-born capability to do so. There is a reason why great artists are hard to come by.

I am not saying that good programmers are born with a computer keyboard in their hands. But if you look at the good programmers around you, you will find that they possess certain traits that are often in-born and neither developed nor grown.

This is where our Computer Science programmes will falter. While we can definitely teach language and structure, we have not yet figured out how to train someone with the capability to perform mental feats of this nature.

However, this is not to say the programming cannot be learned. It definitely can.

I would like to suggest that our universities adopt a problem-based approach, which has found some success in other countries. Just like art, the key to improving programming fundamentals is through consistent practice. However, this is of limited help, and will produce average programmers only.

To produce good programmers, we need to take programming out of the classroom and into the real-world. Good programmers have a deep appreciation of how every piece of the pie interacts with the real world. Good programmers must see the bigger picture and work with details.

Our students must be given the opportunity to explore. I would suggest that our universities also adopt a sandwich-like programme, with students working on long-term internships instead of the very limited two-month stints that they do now.

A longer stint would help mould them into better programmers, particularly if they work in teams that share code with each other. They will get to learn good coding practices and learn how to avoid common pitfalls while exercising their brains on real world challenges.

In my next article, I will explore some ways to learn programming, in the classroom and solo.

Bad Computer Science Programmes: Parents and Industry

This article first appeared on DNA here.

I INTEND to wind up my columns on bad Computer Science programmes by looking at the role of parents and industry.

While both parties are not directly involved in formulating these programmes, they both play different and significant roles in the outcome of said programmes.

The direct role that industry plays in this is that of feedback. There is often an Industry Advisory Panel (IAP) that typically meets annually to provide curriculum feedback. The idea behind this exercise is to ensure that the curriculum is current, relevant and meets industry needs.

With due respect, the IAP often looks at the curriculum based on the present and future work-force needs of their individual organisations. What they often fail to understand is that it is not the job of a university to produce workers for their factories or offices.

The role of worker training is played by host companies during internships. Student interns must be put through the grinder and not merely exploited on menial tasks that nobody else wants to do. They must be given proper coaching and guidance to accomplish their tasks.

Unfortunately, industry often treats student interns as students instead of interns. They are expected to learn, while interns are supposed to work. This excuse is often used to justify under-paying or simply not paying student interns.

Internships are an opportunity for students to evaluate whether they would like to build a career in a particular field. This can only happen if the students are given real responsibilities, allowed to work under real-world conditions, and suffer real-world consequences of their actions.

But this also means that industry needs to change its habit of under-paying interns and exploiting them as cheap labour.   In fact, I would recommend paying a decent wage based on the kind of work that they do and responsibilities that they have. They should be treated like the young adults that they are.

Internships are not merely a necessity for completing a degree but are a valuable real-world learning experience. There is no reason why a student should only do it to pass their course. There are plenty of opportunities to do extra internships, particularly during the long breaks between academic years.   However, few students in Malaysia take the opportunity to do multiple internships in different fields, which is a shame.

If the industry wants to help improve the condition of Computer Science programmes, it could start by running better internships.

Industry should take part in university teaching and learning by giving talks, holding seminars and sharing knowledge and experience with students. It can also play a better role by inspiring and motivating students instead of merely reviewing curricula.

It is not uncommon to find students who have little or no interest in Computer Science, studying it. Apathy is a trait that plagues many students today. Many do not have a clear direction of what they want to do after school.

While always acting in the best interest of their child, the trouble with parents is that they seem to have forgotten that their child is already an adult capable of thinking and acting independently, and should be treated that way.

Instead of making decisions for their children, parents should let their children decide the direction that they would like to take their life. If their child is not yet ready to make the decision, it might be useful to take some time off to gain useful work experience.

Real-world work experience is more valuable than a mere piece of paper, particularly if nothing stands out from that piece of paper. Taking a ‘gap’ year may sound a little alien in our culture but it is an excellent way to learn the value of a job well done and to explore different types of occupations.

In our society, there is now an expectation of schooling non-stop until children are well into adulthood. This endless paper chase is based on the belief that a piece of paper will guarantee a good life. As a result, most graduates have no inkling of what real life is like when they graduate.

While many studies show a close link between education level and future income, a good life can only be assured through dedication and hard work. This would be difficult without interest in their work as interest is a great motivator.

Chasing paper has also become an obsession, with many parents wanting to give their children a head-start in life, which includes the belief that their child needs to finish first to finish ahead. Learning something well takes time and is more important than simply finishing.

I would even go as far as to suggest that parents encourage their children to start taking on various part-time and vacation jobs. Besides learning the value of money, it gives their children an opportunity to learn skills and acquire much needed real-world exposure.

The job of a parent is not to provide their child with an education but to prepare their child for the real world. Parents often confuse one for the other.

 

Malaysian University Entry 2.0

Year after year, we go through the same drama – that of eligible students being denied entry into the course of their choice. Each time, we are promised by our government that they will look into it and fix the problems. Then, the cycle repeats itself the following year.

I think I can safely say that Malaysians are sick and tired of this incessant whining.

I started writing this blog, blaming everyone involved – from the government, parents, teachers, and even students themselves. But then I realised that each and everyone of us are already far too familiar with the causes of the problem.

So, I decided to write about some solutions instead.

First, let’s start by giving people the reasons for rejecting them. That’s just plain courtesy. It’s bad enough that the kids have to see their futures crushed, it’s worse to have it crushed under some giant uncaring bureaucracy.

Giving people a logical and rational reason for denying them their future, will also serve as good feedback so that they can improve on their weaknesses and reapply again the following year if they choose to do so.

Cold hard rejections won’t cut it.

Second, we need to have better career counsellors in schools. We need to impress upon students that there are plenty of other ways to achieve success besides studying medicine and that medicine is not for everyone.

The job of a career counsellor should include learning about the student’s aptitude, likes and dislikes, and helping them sort out the myriad future career paths they may have. This helps to put the right people in the right places for the future.

We need good, passionate and dedicated people in every field.

Third, we need more transparency in the selection process. It will go a long way to promoting confidence and trust in the fairness of our system. In the age of reality television and live interaction, an opaque process will not do.

I would suggest publishing the details of all the applicants publicly. This allows everyone to see where they stand amongst their peers. Any privacy issues can be side-stepped by removing all identifying information and just publishing the relevant scores.

A little public competition always helps.

Co-curricular Work

I attended a short briefing at Taylor’s University last week, where they asked us for comment some new things that they were embarking on.

However, I took the opportunity to put forth some suggestions on how universities might help improve some of the problems that I see with young graduates today – a lack of responsibility and discipline.

While I would certainly like to see sandwich programmes for our undergraduate degrees, I know that it would be very difficult to get that idea past the MQA. However, it might be easier to just award co-curricular points for students to do part-time or vacation work.

Unlike internships, it would not need to be related to their field of study. In fact, it might be better if it wasn’t related to their field of study. Even a simple sales job at a hypermarket or a simple waitress job at the local kopitiam, would be good.

It would give the students an opportunity to face the real world and to see what things are like out there. If they got some scolding from the customers, all the better for building character!

I doubt that any university would do it though.

Bad Computer Science Students

computer science students at the airport
computer science students at the airport (Photo credit: stefanx80)

This article first appeared on DNA, here.

IT would not be fair to just rant about the education system and bad teaching quality, as in my previous columns, without pointing out problems with the most important component – students themselves.

I would say that of all the factors that affect Computer Science programmes, this is the most crucial.

While student selection is one of the areas accredited by the MQA (Malaysian Qualifications Agency), the criteria is largely concerned with fairness and preventing arbitrariness, and ensuring that students have the necessary entry qualifications. The assumption is that students will compete to enter a programme that they want and will therefore work for it.

However, if I were to walk into any Computer Science faculty in the country today and ask the students if they wanted to be a Computer Scientist after they graduated, I would be surprised if more than a handful says ‘yes.’

If I were to ask the rest for the reason that they applied to study Computer Science, the answers would just sadden me.

As a result, there is very little passion among Computer Science students for their choice of study. While the exact relationship between passion and success is not entirely clear, every successful person attributes passion as key to their success.

That is all that I wish to say about passion as there are a lot of comments on this elsewhere.

What surprises me further is that many students do not seem to realise that they need to take ownership of their life. If they don’t care about their future, nobody else will. But most students seem happy to simply coast along with the aim of merely passing the course.

Again, this is a general issue that seems to plague the young, and I will not comment further on it.

What I wish to talk about are things that a student needs in order to take an active role in determining their own future.

Students need to realise that university curricula can barely keep up with the developments in the field as things move too quickly while accredited teaching processes do not. However, that is no excuse and it is still essential for a student to keep abreast with the latest happenings in the field.

Therefore, all Computer Science students need to be capable of independent learning, beyond the standard curriculum. While learning fundamentals is critical, it is not the only thing worth learning. Having depth of knowledge in a specific domain is also very useful.

The fact that computers are in every aspect of our lives just makes this much easier for Computer Science. All a student needs to do is to pick something that interests him or her personally and to keep track of the latest developments in that area. This is also a great way to instil passion.

For students who love biology but ended up in Computer Science, take a look at developments in genetics and computational biology. For those who like cars, it might be useful to learn about 3D dashboards and self-driving cars. If a student likes fashion, it might be fun to learn about augmented reality and body area networks. The list goes on.

While future employers do not expect students to be experts in the domain, being in touch with them demonstrates that the student has an interest in it.

Then comes the learning. The best way to learn any skill is to put it into practice. Just choose something interesting and start tinkering.

While this is nearly impossible and possibly illegal in many other professions, it is highly encouraged in Computer Science. There is no excuse for not being involved in some personal project or open-source project – big or small. Facebook started as a personal project.

While not everyone is destined to be Mark Zuckerberg, such projects help build up core analytical and thinking skills plus language expertise and development process experience. These are all important skills that help guarantee future success.

One can often learn more in a failed project than by merely reading a textbook.

In fact, I will go so far as to suggest that all students should publicly publish their work for review and critique. This may be difficult in certain fields but a github account is all that is needed for the modern Computer Science student to do so. Soliciting honest criticism is the best way to improve ourselves.

Unfortunately, our students are usually too ‘shy’ to show off their work and learn less in the process.

Computer Science is not just about data structures and algorithms. It is not about Java or C/C++ either. The good news for all those students who have no interest in the field is this: It is important to realise that Computer Science is not all about programming and abstractions. Those are just tools.

Computers have a very real presence in our daily lives and are becoming more important by the day. It is just as crucial to learn how to use the correct tools to solve specific human problems in different domains.

Computers are present in every domain of human endeavour and a Computer Science student can be useful everywhere.

So, instead of just coasting along and hoping for the best, students should take a pro-active role and take charge of their lives. Computer Science gives students unprecedented freedom to experience and experiment with the real-world, unavailable in any other field.

Carpe diem.