Thursday, 16 July 2015

I am 25 years old and I am programming for the past 6 years. Here are my take aways on Software Engineering

Engineering is hard. Engineering a good software is a team effort. More often programmers think that their ideas can be transformed into code within a week which the users will absolutely love. Then they can roll on a Ferrari which is bought from a portion of the money from a major acquisition. In reality, things go wrong more often. Software Engineering is a craft and if practiced well one can reap the benefit from it. 

I used to think programming as just an activity in which you sit in front of the computer, pick a language (mostly Java) and do what ever you want with it. But as soon I started to work with a team, I realised programming is different from engineering a software. You need to be wary of several  techniques, processes and concepts in order for this to work properly. I am practicing Agile and Extreme programming practices for the past 2 years and it seemed to help me to be better engineer. Here are some of the key points from my experience.

Use Version Control

Now a days this has become the de-facto standard of all the projects in the industry. But to those who haven’t used it, seriously consider using it. I have used SVN and Git. I would like to stick to Git in future until I find a better alternative. Thanks to Linus.

Be Versatile

Learn at least two programming languages, one scripting language and assembly language of atleast one architecture (X86, PPC). In my career, so far I have worked with Java, Ruby, Python, Erlang, Objective-C, Swift, JavaScript, shell script, also have written and debugged x86 assembly code.

Use the right tools for the right job

For programming in java I mostly use Idea IntelliJ editor since it has refactoring and better code navigation features. And for scripting I mostly use Atom editor and vim. I am still learning Emacs.

Have lots of tools and framework under your arsenal

In your career, you will reach a point where you have to make decisions about what software components to use to build your software. This is mostly taken care by architects, by I strongly believe we as Software Engineers should be more informed and should make such architectural decisions.

 What relational database would you pick - Postgres, MySQL, Oracle or Microsoft SQL server ? 
 Which No-Sql database would you choose - Redis, Mongo DB, couch DB or Neo4j ?
 Which web platform would you choose - Play, Dropwizard, Sinatra, Ruby on Rails, Django, Flask or Node js?

It is important for a software engineer to know why one software component is better than other. This will help us choose the right one based on our needs. Some of the developers will have the urge to write everything from scratch. I would strongly urge you use tried and tested frameworks and libraries that will save you a ton of time. If nothing fits your need, don't be afraid to write one.

Learn concepts

It will also help you to know 

Operating system concepts such as scheduling, paging, memory management, virtual memory, context switching, stack frames etc.
Distributed system concepts such as CAP theorem, eventual consistency,  clock synchronization, network partition, distributed caching etc.
Networking concepts such as TCP/IP, Virtual LAN segments, WAN, DNS, ARP, SAN, NAS, DHCP, HTTP, SMTP etc.
Database concepts such as Indexing, Sharding, Query planning etc.
Language concepts such as Compilation, Assembling, Garbage collection etc.
Programming concepts such as procedural programming, Object oriented programming, functional programming etc.
Mathematical concepts such as algebra, statistics, probability, calculus etc.
Graphics concepts such as rendering, graphics pipeline, GPUs etc.
Data structures and algorithms. 

Follow processes

Be it Agile, lean, XP or whatever, follow it. Practice continuous delivery/ continuous integration. Use tools like Jenkins, Go CD, Travis CI, TeamCity etc.

Test your code

Don’t rely on manual testing for the most part. Try to test your code with code. You can write unit tests, integration tests, end to end tests and/or functional test to improve test coverage. Believe me tests helps a great deal than you think.

check out some of the testing frameworks like JUnit, Jasmine, Cucumber, Appium, Selenium etc.

Attend conference at-least once a year

Try to attend a conference around your place atleast once a year. This will motivate you and put in touch with the community around you. I attended Functional Conf  last year in Bangalore, India and it has been a eye opener for me.


Even though there are more things to do to become a good engineer, I am leaving you at a logical point here. Hopefully my perspectives will change in the next 5 years and I will try to writeup another post on this. Till then keep learning.

No comments:

Post a Comment