As any reader of this blog should notice, I haven’t published any post for quite a long time. Well, writing new articles for my blog isn’t my priority. In fact a lot of things happened/changed in my life and I simply concentrate on those things, rather than keeping focus on archiving them as a piece of text.
On the other hand it is also an interesting experience to write about some events with a few month perspective. One of the major advantage of this approach is the ability to see consequences of your decision. The another benefit is that I forget(!) about most of details so it is much easier to write about aspects that really matters.
Episode 1: After the high school final exam
As I mention in previous post1, the final exams wasn’t exhausting for me. By the time I finish my last exam, I knew that the following holidays will be probably the longest in my life and I don’t want to waste that time. Also I want to try something different, so I decide to look for a job. By the job I hadn’t mean any kind of work, but rather something that gives my satisfaction and sort of experience in software industry. Unfortunately in city where I live it was really hard to find something interesting. Most of the “computer industry”2 companies are mostly doing websites (nothing more than PHP) or repair/sell computers. Nothing challenging, writing yet another CMS isn’t my dream.
So I started to use my own contacts to find something slightly more interesting. One of the common prejudice that I seen was lack of belief that I’m able to write programs effectively (eg. right after the high school! not even in the university). The another approach was a great enthusiasm (eg. Oh fantastic! We have a lot of work for you.), but when it come to details there wasn’t anything to do(eg. we need XYZ, sometime in the future, not now). I didn’t gave up and continue searching.
Some time later, while I was checking a weather forecast at ICM website3, I saw an job advert. I was about participating in Research & Development internship program. For me it sound perfect, unfortunately it has requirement to be the university study. Nevertheless, I decided to give it at try. (…) After a few talks I was hired.
Episode 2: On the canoe
The ICM internship schedule was aligned to university holidays, which means that I had a week free of work before it. I decided to go on canoeing rally, on the river Obra in Poland. This river is not so popular, so it includes a lot of natural barriers like fallen trees, shallows and so on ;-). Those things make a day in canoeing slightly more interesting. I enjoy it really much.
Episode 3: Internship at ICM (Warsaw)
<style type=”less text, more data”>
Generally, my internship was divided into two projects:
- commercial: R&D project for one of the largest Polish IT company – Prokom Software; unfortunately I’m unable to talk about it in details, because of NDA that I signed.
- scientific: data mining; analyzing natural text (written by human) using methods based on statistic distribution of n-grams; I’m planning to write separate post about this project.
In scientific project my routine look something like that:
- Implement idea (in C++).
- Analyze data using program written in previous point.
- Talk with a PhD mentor about results, he also suggest some methods.
- Read papers about those methods.
- Back to point 1.
As you can notice this is infinitive loop, it is because the project is still unfinished.
I write code for data mining project mostly in C++, with a few minor parts in python and XSLT. A few important things that I learned:
- A good revision control program is a must. Use it even in a small personal projects. It is good to be familiar with them. It doesn’t really matter which program you use for it, it is important that you commit your work often and control your work. Personally, I use mercurial (hg).
- Unit tests/automatic tests/test data are necessary. Any programmer (no matter how he is experienced/talented/educated) makes mistakes, especially in large projects. It is crucial to make a lot of tests in automatic way in order to find bugs early and fix them. Never assume that something is correct.
- Have a to do list. It’s hard to remember everything so keep it on PDA or PC. It is important to track what is important to do and what is optional. Even if you spend 5% of your time organizing your work, its definitely worth it.
- Time sheets at first could be irritating, but they are efficient to monitor your work. It is information not only for manager, but also for you. Try to be specific (write exactly what you did, not just work on XYZ project). Separate large task into smaller ones and write how much time you spend on them. Be accurate, but not too accurate (15minute aligned is OK). Don’t afraid that you spend some time on silly things like 3h on debugging, sometimes it happens.
- Rewrite a code only if have a really good reason to do so. A good reason:
- something is defective by design (it should be extremely rare situation)
- lack of important functionality
- using an external library instead of self-written functions
- code could be much simplified (rare situation, much = 50% shortened or more)
A bad reason:
- simplify it, but only a bit,
- change programming style to my instead of someones else style
Unnecessary changes tends to lead to new bugs, and are productive killers, so avoid them.
- If you work on the computer, take micro-breaks (eg. 15 second per ~15minutes). Stand up in that break and make a few steps. Even if you have to spend 8*4*15s = 8minutes a day on those breaks, they could be extremely helpful. Firstly, you have a time to think, whether some components could be reused, or make something easier. Secondly, you will be less tried after a day of work and be productive till the last minute. Of course the breaks are for you, so don’t be afraid to skip one if you are just in the middle of writing a short function.
- Write clean code, and document your work. Don’t do it later. Do it while you code. Even one-liner comments could be really helpful. Write about intentions(eg. parse data file), not about what you do (sum up X[i] table to variable sum).
Working at ICM was an amazing experience. Not only learned I a lot of about real world programming, but also I have opportunity to challenged with absorbing technical/science problems. Moreover, I was a part of a great team led by incredible smart PhD.
Will be continued in the next post…
Episode 4: SKMA camp in Tatra
As it were the very long holidays, I also spend some times relaxing in the Slovakia. I went there with a catholic student organization SKMA. I meet a lot of fantastic people and make a lot of new friends. We were mainly hiking in Tatra Zachodnie and Tatra Wysokie. The only nasty thing was the weather, We had experienced a lot of snow in the high mountains(in September!). The photos from this camp are in the gallery.
Epilogue: The beginning of the studies
On the 1st October I started studying mathematics and computer science at Warsaw University.