Wednesday, May 19, 2010

A development learning story...

So here I am - trying to learn programming, surrounded by several of my university colleagues who know more about it than I do. I want to be better and I am getting better. Bit by bit. I start creating simple programs from scratch. No internet yet, no google. I’m searching inside several help systems I can get my hands on and I improve myself day after day. Time passes; I start to skip some of my university classes. Instead, I’m staying at home creating from scratch more and more complex programs. My colleagues are helping me. Sometimes with information, sometimes showing off, making me want to be that good and sometimes with words like “I’ve listened to you for the past 30 minutes and didn’t laugh because I know you don’t know things … but you are not right”. And this makes me want to be better again and again. I’m starting to isolate parts of my code making “libraries” of reusable code. Then get better at making libraries. I know how to make it extendable, how to document it and how to reuse it. Now I’m better than most of my colleagues and equal to the rest of them. They accept me, but I accept no one. No one’s code is good enough to be used. I’m creating everything I need and I’m good at it. I believe I can create something like Windows 3.11 for about 3-6 months all by myself and I believe myself. Slowly I’m starting to realize that things are deeper than they look and I have to start trusting other people’s code in order to create complex programs. I’m also starting to understand that more complex doesn’t make it better and now I’m creating simpler code. Make methods and functions smaller, make code blocks as clear as possible and always strive to keep it simple (but not stupid!). Somewhere in between I’ve started switching programming languages. Going from Pascal to Assembly, mixing it back with Pascal, then C, then C++, a little bit of Delphi, then Java, some Perl and the list goes on. With time I’ve switched programming APIs and concepts too: DOS, Windows, Embed development, POSIX. All of them came with their own charms and specifics. At this time better programming books got published, explaining concepts like design patterns. Too late, I’ve already discovered all these patterns by myself. It was funny someone spent time to collect those obvious ideas and give them odd names. I still believe design patterns book made more harm then it helped. People need to discover those things by themselves or they won’t truly understand them and know where to use them and more important when NOT to use them and why. Then I’m discovering next “library” level – modularity. It is dynamic, it can be switched on and off on the fly, it can be replaced with fixed/newer version without recompiling the rest of the code. After some concept polishing and learning how others do it, I’m starting my own product based on my own modular concept. It is small, it is clean, it is clear. It is a great piece of technology and none of my clients cares about this. Slowly I start realizing, that though modularity is great, it took at least 50% of my development time to plan it, make it that great and support it in the future development. This time doesn’t pay back – really! I also start understanding that I seldom use any piece of my code twice. I’m learning as I go and I almost always know a better way to do it after several months. The way sometimes involves using a new library and sometimes it’s just me knowing more. In either case I get my old code and rip a good part of it creating something new, instead of reusing it.

So here I am - creating more and more complex software, using the best I can find pieces of other people’s code and creating the rest on my own. Always try to keep it simple (and not stupid). Keep it small and clear. Don’t make a block of code do more than one thing and don’t make it bigger than one screen can display. Use comments sparingly and describe your context, reasons and ideas there. Don’t make reusable code unless you’re creating a library on purpose. And programming languages - they are just a way to express yourself. Programming concepts like functional and object oriented programming too. They don’t really matter. What matters is to understand the core idea behind them in order to use them effectively. Once you understand it, you understand that it is possible to create a complex solution with plain C as easy as you create it using Java, C#, C++ or whatever.