I told you a story about my college life in part 1 of this post. Now I want to give you an overview about programming languages and choices. And what should you learn, what should you care about when go with programmer career.
In my experience, I can divide programming section into some categories based on scaling level:
- Global-scaling: you go with Google or Facebook infrastructure. One simply answer, you can’t. You need to be a super talent, or many many experienced to work with something scale in global. You can easily create a racing game using pure Java socket to serve about under 50 players concurrently. But when it come to millions of parallel connections, everything just break. You had played World of Warcraft or heard about it? Ten million of users, and every actions of character need to be transfered, processed and displayed in milliseconds.
- Enterprise-scaling: easier, however, you will need to know about concept of enterprise class application. For example, transaction, security model, views and redundancy. You will create application for banks, internal company management software, hospital software or something similar. You go with requirements collection, architecture design, database schema, and everything conform to object-oriented. If you can learn well with these subjects: Object-Oriented Programming, Orject-Oriented Architecture Design, Network Programming, Database and Distributed Database, etc. I can tell you that you can join this type of scaling without any problem.
- Desktop-class: for smaller use, it can be a OpenCV-based application, it can be Swing-based management application for libraries, for school. However, this class sometimes requires you have experience with specified technology like image-processing, data-mining, fast and efficient searching algorithms. When you learn about Data Structure and Algorithms, Computer Graphics, Image Processing, if you can find yourself with those subjects, then you can easily own the desktop-class applications.
- Mobility-class: you want your products to be used everyday, by everyone? Then mobility class is for you. You just need basic knowledge about object-oriented programming. Then download SDK (Android, iOS, Windows Phone?), read some tutorials and you are ready to go. You can make a mobile app in just few days, or make an awesome mobile game in just few months by yourself. You will also need some knowledge and experiences about user interface and user experience (UI/UX) to make your app/game more interesting. Of course, mobile is trending now, and it is easy to be a mobile developer, however, to be a guru mobile dev is not that easy.
- Embedded: you have learned Computer Architecture? You can beat any assembly problem? Then you may find embedded class should be available for you. You will create software (should be called firmware instead) to be used inside micro computer, like refrigrators, owens, TVs and any gadgets around us right now. You can even go further, like create your own gadget (which Mr. Nam Ster had already done with Emotiv and InAir) and become new startup in Sillicon Valey.
- Core and OS-class: you will need broad knowledge about almost everything of computer science. You will be responsible of building frameworks, libraries, components which will be reused by other developers. If you like open source and want to share anything you know, then go with this class.
Okay, now you can have an overview about what you will build. Then what about programming languages, and do I have to learn new language every year?
Hmm, the answer is Yes, and No too.
First, you should master one, and only one language-family. Why I called it language-family? What is language-family?
- C family: including C/C++/C#, you can count for Objective-C too. They are using almost same syntax, there are many languages which belong to C-family. But if C is procedural, C++/C# are object-oriented. Then my advice is to learn C/C++. You can work with C, then you know about pointer, about low-level memory management, about internal array memory block. Then go for C++ with object-oriented, generic, template, stream and so on. You can imagine C++ is just higher-level of abstraction, powerful of features and also is my favorite language.
- Java family: mainly Java and different branches. I will talk about Java, most popular programming language for now. A mainstream object-oriented language. You will have a subject Object Oriented Programming, which mainly use Java. Although I have my favor with C++, mostly, I work with Java (not true for now). With Java 8 becomes available and Java 9 on the way out, Java has ability to perform well from mobility (with JavaME, and now Android) to desktop (Swing based application) and enterprise level (you know Amazon was designed and developed with JavaEE?). Only learn Java if you can easily understand concept about object-oriented. It will give you good overview and concept about software design. I have meet many people just learn and code with Java without any knowledge about inheritance, polymorphism, encapsulation and abstraction. Strong-knowledge about Java will help you to easily learn any other OOP languages. With Java, I advice you to read Core Java I-II, then Thinking in Java, and finally Effective Java.
- Other scripting languages: including PHP, Python, Perl, Ruby, etc. (Note that HTML is not counted for programming language, it is just markup language). I don’t have much experience with them. But if you want to go for web programming and frameworks like WordPress, Joomla, Django,… then go for PHP first, you know style of PHP, then you can write in Python or Ruby easily. Almost these language requires framework to work with. So experience with languages, is not too important like experience with frameworks.
But should I learn new language for new year? The answer definitely Yes. If you have bold experience with one language, adopt a new one is easy. New languages come everyday: Dart, Go, Swift,… I call them modern language with reduced syntax, object-oriented in first class. (Note that while Java still has primitives, Swift considers all primitives are object, so Swift is “more” oriented than Java). After all, you will realize that you can not master all languages, but you can confidently say that you can work with all languages.