Tuesday Aug 07, 2007

For the past few months, I've been busying myself with my CS degree final project. On this blog post I want to reflect on a few interesting things I'd experienced during the project. Sure there are gazillion of books talking about flaws and pitfalls in Software Engineering but nothing's more enlightening than experiencing it firsthand.

 The project was quite large relative to the limited 3 months time frame. So, it's been quite a rough for me and my teammates, but we finally pulled it off with perfect score and a lot of fun. As tech lead for the team, my responsibility covered things from planning the implementation, architecting the software, writing and reviewing code, and acting as go-to guy for the team.

Here are the 10 most important lessons I learned from the project:

On Scheduling

Lesson 1: Beware of Parkinson's law

Must be avoided like a plague. It's really easy to fall into the trap. No matter if you are project managers or team lead, if you are responsible for scheduling, make sure you do frequent checkup and communicate with team members.

Interestingly, I found that people tend to underestimate their true potential. If your team members think you are insane with your proposed schedule, don't brush it off right away. Make sure that enough support is provided for them, put  enough pressure and disciplinary, see how things work out and be flexible. The reward from pulling it off successfully is huge amount of self-respect and confidence.

Lesson 2: The best time to start is when you think it's too early

I got this from Paul Hibbitts, one of my instructor on designing usability a few years  back. And since then, it has always been my philosophy in thinking about when to start a project. My team wouldn't be able to pull it off if we didn't set to start right away.

On team working

Lesson 3: Team dynamic is the more important than skills 

Technical skills can be learned, but not the team dynamics and working habits. I was lucky that my teammates have quite strong character. Each of them have high self-esteem, determination, and great sense of responsibility. During the time when stress and pressure reached its peaks, we were still maintain optimistic view and fun attitude.

Lesson 4: Communication is key

Schedule slips, budget goes overboard, specification has changed, these things are inevitable in software project. For whatever happens, make sure everyone knows and take actions. In a team working environment, success comes from team effort, but failure can come from one's mistake.

Lesson 5: Respect the meeting agenda 

During team meeting, it's easily for team members to get tied up on technical discussion and forget about other things. We tried to organize our meeting agenda to cover various important topics including scheduling, implementation, report. As it turned out, we tended to forget about the agenda and focus our attention on technical side more than we should. 
 
Lesson 6: Be a good mentor 

At the beginning, apart from myself, the team didn't have much technical background in Java and nothing at all on Hibernate and Swing App framework. Yet, other team members picked it up in just a weekend after I send them useful links on the subjects.

The team UI designer once asked me how Swing would handle events. I could have answered her right away, but instead, I give her a few links to various Swing tutorials. Not because I tried to act as mentor, but I was busy at that time. As it turned out, she came back 15 minutes later and proposed a solution that's better than what I originally had in mind. This is how much you can learn from being a mentor and not simply just giving out answers.


On development 

Lesson 7: For an amount of time you spend on design, you save 3 times of that in implementation 

We didn't put as much time on design phase as we should have. We ended up having to go back to the drawing board and do rework a few times.

Lesson 8: No matter how far you've gone on a wrong path, turn back

And yet again, we didn't turn back. 80% of our allocated time was spent on the last 20% of the code...

Lesson 9: With great features come great responsibility

Software team usually gets excited on a new project early in the beginning. They would crank up a number of features and overestimate the ability to deliver them within specific time constraints. Some simple rules I use to avoid feature creep syndrome:

  1. Focus on the requirement

  2. Clearly separate 'needs' and 'wants' features

  3. For each of the new feature, carefully think of its interaction and dependencies other existing ones. The higher level of dependency the more time it takes to implement. There are some metrics and methodology you can use for estimation like COCOMO. Steve McConnell's book on software estimation is also a good source on estimation.

Lesson 10: Aim for successful delivery, avoid drinking technological Kool-Aid

Picking development technologies and frameworks for a software project can be a difficult task. Most often, you wouldn't have the privilege of choosing the technology that you and the team are comfortable with. If you do, it's can be equally if not more dangerous.

Each technology from each vendor has unique strength and sets of features. It's also easy for us geeks to go for the leading edge immature technologies. If chosen without careful consideration, the whole team might end up be drinking the Kool-Aid. The project itself turns into a research-oriented development

Ultimate lesson: DON'T BE AN ASSHOLE

You are working in team for a simple reason: you can't do it alone! So, be nice to your teammates and give them respects they deserve. I believe that as important as delivering result is to have good time working on the project. Communicate with authenticity, respect for others, and an open mind can turn the time you spend on a project to an enjoyable one =) !

 

Saturday May 05, 2007

A lot of people, especially from Open Source community and computer geeks, believe that software should be free to everyone (and commercialized software is the source of evilness in the world!).

Well..I'm just thinking from a software developer standpoint here. It's cool and hell lot of fun to do an open source project and make it freely available on the web. But building and maintaining a solid* piece of software isn't always free, is it? There are also questions on quality and commitment as well.

Please share with me your opinions on this.

note: by saying 'solid' here I mean, the bugs are
minimized, there are usability testing, the software doesn't crash your and other's systems, and
you can really use it to do some good.

 **Update**

As a response to Simon's comment, for this blog entry, "free" means that the software can be downloaded and used for both personal and commercial purposes without time limit and purchasing. The software can be either open source or close source. It can be a complete product, a patch, an extension, or a framework.
 

Monday Feb 12, 2007

Found this interesting article, “The Death of Computing” from SlashDot site. On this article, the author expresses his view on the declining in popularity of Computing Science in university.

As a CS and Business administration undergrad myself, I agree with the author that the demand of CS grads seems to be in the decline of late. Yet, to say that the impact and importance of CS will be diminishing overtime is somewhat incorrect in my opinion. Rather, I believe that CS will become even more significant in the future than ever. Here are my 11 thoughts reflecting on certain points from the article:

1.
'Number of CS students is dropping from the view of IT as job for geek sand social misfits and there’s nothing interesting in computer science'

  •  I do not agree with this. Ever since computer became a commodity, less and less people think that IT is a job for geeks and nerds. It’s more of the other way around. From my experience, most of us in 2.0 generation perceive IT people as trendy, up-to-date, well-educated, and smart. Look at a few CS idols, Sergey Brin, Larry Page, Mark Zuckerberg (Facebook), Max Levchin (Paypal), or Kevin Rose (Digg), don’t we just love these nerds?

2.
Games programming as CS salvation and the last lifeboat

  • Game programming is cool. True, universities’ CS department doesn’t teach you how to do game programming - they teach you how to build a program that is used to build game. I also think the recent popularity of game programming is a trend (like SOA =) ?). If you think game programming is the coolest thing in CS, you should come visit my university CS labs. We do research on CMT system software, Natural Language Processing, RNA computational modeling, Robotics, and more cool stuffs. So, you still say CS is boring?

3.
‘Virtual robots - Zooks - can be created by eight-year olds without needing programming, logic or discrete mathematics skills’

  • Can this robot do something more than simple arithmetic? I don’t think a robot that is built by eight-year olds can do anything beyond what an eight-year old could think of. Of course, it’s not the kids’ fault. The potential is there. Once they attend Computational Algorithm class (most likely offered by a university CS department) 10 years from now.

4.
'Web designers build complex business sites'

5.
'Accountants assemble business systems without needing to go object-oriented.'

  • This is scary....(but not such a bad idea actually, most of IT projects are overbudget and late in delivery).

6.
'There is no longer a need for vast army of computer scientists. The applications, gmaes, and databases that students once built laboriously in final year projects are bought at bookshops and newsagents'

  • This is possible because of what we do in CS: innovation 

7.
'IT departments now focus on contracts, tenders, service level agreements, training, system usage and incident management.'

  • Isn’t Management of Information System one of CS discipline? How can you do UML modeling, system integration, system architectural design without attending CS classes? I doubt that you can learn all these from ‘Teach Yourself’, ‘Dummies’ or ‘Idiot’s’ books series.

8
'Implementation, facility management, systems integration, service management, organisational change even environmental audit are the language of IT. These hardly feature on computer science courses.'

  • I believe they are now a part of CS curriculum now, at least in most of North America’s universities.

9)
'Computing is also affected by globalization. The loss of jobs in IT and the declining computer science enrollments is a global problem for developed countries.'

  • From my ECON 101 class, the law of supply and demand suggests that eventually labor cost and wage in Chindia will increase and competitive advantage from outsourcing will diminish.

10)
'There is a need for innovation, for creativity, for divergent thinking which pulls in ideas from many sources and connects them in different ways.'

11)
'Computer science curricula are old, stale and increasing irrelevant. Curricula needs to be vocational, and divergent, widening the computing student's view of the world, not creating a sterile bubble, closed off from the wider issues in the world, and from the networking, the integration, the global reach of computers.'

  • I totally agree on this =)

 

Quite a long blog entry, this article is very thought provoking.

This blog copyright 2009 by teera