Showing posts with label Miscellaneous. Show all posts
Showing posts with label Miscellaneous. Show all posts

Saturday, October 22, 2011

Influential Books On My Career in Software Development

I was just thinking about how much influence certain books had on my career, whether concerning object-oriented design, enterprise architecture, or even business soft skills, so I decided to list them in this post.

Here are the technology books that had the most influence:
  • The Pragmatic Programmer: I still remember the fascination I had with this book after reading the story about Stone Soup in the first few chapters. It was one of those soft skill patterns that come in extremely handy when you think you have a great idea to improve effectiveness at work, but are faced with a lot of resistance to it by coworkers (especially novel ideas like Pair-Programming). In summary, the lesson from Stone Soup is to walk the walk first, and then let people talk the talk for you, instead of starting with the talk before any walk. You start applying the idea at a very small scale, and if it demonstrates benefits, people testify for you, encouraging the application of the idea on a larger scale. And if not, no harm was done given the small scale you started with. You got to try the idea at least, and can rule it out moving on to another idea instead of dwelling on people's resistance to talking about it with no action taken. I found this book a great read when I stumbled upon it several years ago as it contains many lessons in soft skills in addition to technical skills as developers need both to succeed at work after all.
  • Head First Design Patterns: This was one of the most entertaining technology book reads I have ever had, and I still find the comedy in it extremely enjoyable and educational. It is my favorite on how to learn practical application of Design Patterns, and by practical I mean, knowing when it is appropriate to apply them, not just how to apply them. 
  • Applying UML and Patterns: This book has been perhaps one of the most influential books on my object-oriented design skills as well as integrating the process with Agile software development. And, don't let the name of the book fool you. It is not focused mainly on applying UML. It just emphasizes Agile UML diagramming (mostly on paper or whiteboards) as a healthy communication mechanism between team members to better brainstorm and get ideas across. GRASP Patterns (e.g. Coupling and Cohesion) are a huge takeaway in this book as they serve as the underpinnings of successful object-oriented design, and knowing when design patterns are beneficial. 
  • Domain Driven Design: One cannot do object-oriented design well in isolation from business. Knowing how to speak the language of the business domain is crucial in achieving an easy-to-maintain-and-extend software design. 
  • Refactoring to Patterns: Design Patterns are often best applied gradually in response to new business needs as opposed to prescriptively without the business needs being present yet. For example, if an application only seems to need two ways of sorting data on a report at the moment, a simple "if" statement might get the job done well. If in the future, new business demands required more sorting options that need to be reused in multiple parts of the application, then sticking with the same code design simply expands the use of the "if" statement with more branches. That makes readability of the code less abstract and understandable at a glance, and requires duplication of the "if" statement in all parts of the app that require the same sorting options (unless procedural method reuse was done). That is an example of a need to refactor the code to the Strategy design pattern in order to replace the if statement with reliance on polymorphism (GRASP Pattern) via sort strategy objects. "Refactoring to Patterns" is a great read on this extremely useful Agile skill, and so is its predecessor Refactoring.
  • XP Explained: Reference book on the radical ideas of eXtreme Programming. A must read for any software developer who wants to go beyond the overly-controlling Waterfall process or out-of-control adhoc process in software development, even if they cannot apply all its ideas in their environment. It is eXtremely mind expanding as it pushes your thinking outside the boring box that the masses tend to constrain their thinking to.
  • Apprenticeship Patterns: Awesome book on how to become a quick learner (a must in the technology field), stay humble despite experience, and remain open to new ideas the way beginners are. Some of my favorite patterns are "Wear the White Belt", "Expose Your Ignorance", and "Breakable Toys".
Notice how I did not mention any books on Test-Driven Development or Pair-Programming. That is because from my experience, the best way to learn them is not through reading books, yet through actual daily experience via pair-programming with other developers (apprenticeship) that are quite experienced with both skills (these two skills go hand in hand). I have seen developers inexperienced with test-driven development miserably produce difficult to maintain test suites with complex code implementations that are difficult to refactor. I have also seen developers nod off or waste time tweeting while pretending to pair-program. To avoid such pitfalls, it is extremely important to pair-program with experienced pair-programmers, and to learn all different styles of test-driven development (e.g. state-based vs interaction-based, outside-in vs inside-out, integration vs unit, etc...) to understand their trade-offs and when to apply each. After all, badly done Test-Driven Development and Pair-Programming is like badly done anything. It will result in worse results, and unless the developer had enough foresight, they might then blame the technique instead of their lack of skill in it, and thus miss out on the benefits of learning completely. Just think, a non-skilled skiier might not enjoy skiing very much. But, is it the activity of skiing or their lack of skill in it that is responsible (assuming they are quite interested in it)?

Here are a few non-technology books that also had a huge influence on my success at work:
  • The 7 Habits of Highly Effective People: Helped me direct my career and sort my priorities as taught in the habits "Begin With The End In Mind" and "First Things First". Also, it had a huge influence on the way I try to come up with solutions that bring everybody in the company together, whether in development, QA, or business  (the "Think Win-Win" habit) and be open minded to collaboration that achieves much more creative solutions to problems than flying solo (the "Synergy" habit)
  • How to Win Friends and Influence People: Great aid in social skills for a techie like me, helping with public speaking skills and learning respect for non-autonomous and barely-logical entities (a.k.a non-computers, a.k.a. human beings!) 
  • The Magic of Thinking Big: This was the book that shattered all artificial and societal constraints that I had acquired over the years about how much I can achieve in life. After reading it, I stopped believing that I am constrained to my I.Q. (or maybe realized you can increase your I.Q. indefinitely) and stopped seeing any boundaries to anything I can do at any organization or in life in general for that matter. Let's just say that not only did I eventually learn to do public speaking in front of masses of people (EclipseCon, EclipseWorld, RubyConf, etc...) after a quarter century of being a shielded introverted shy person, but I also learned rudimentary drumming skills in the last 3 years and now perform in two rock bands (Gag Order and Cletus Darby) around the city of Chicago. 
What are the books that had the most positive influence on your career?

Sunday, December 19, 2010

What makes a developer valuable to Obtiva?

I was recently asked by someone what makes a developer valuable to Obtiva.

Here is the answer I gave:
  1. The developer genuinely cares about the client needs: If the developer does not care about delivering something that serves the client needs, then no amount of work would help achieve success.
  2. The developer strives as much as possible for effective communication with the client: After all, if the developer cannot communicate well with the client to understand their needs, then no amount of technical skill will help them deliver what the client needs.
  3. The developer is always eager to learn something new: As long as the developer is motivated to learn, he will be able to overcome any shortcomings in his current technical skills.
  4. The developer is willing to collaborate with others: A developer who does not play well with others will hamper the project velocity and productivity regardless of how superior his skills are compared to others'.
Notice how none of the points above mention anything about skills in programming languages, software processes, or frameworks and libraries. After all, experience has taught me that soft skills trump hard technical skills at getting to success.

Wednesday, January 28, 2009

About My 2008/2009 Vacation

I've been wanting to blog about this for a while, so here it goes.

I spent my Christmas vacation this year in Dubai, and I got to see a lot of interesting things, such as the world's new highest tower (higher than CN), one of the world's largest malls (slightly larger than Edmonton's), a 7-star hotel that looks like a sail, an indoor skiing/snowboarding hill, palm artificial islands, and a hotel that is partially underwater and has a massive aquarium.

Best of all, through a friend of mine who works in technology in Dubai, I got to go to a programming user group meeting that had Matt Mullenweg from WordPress/Automattic.

Here are some photos from the trip:



Highest tower in the world (Burj Dubai)



Atlantis Hotel partially underwater at the head of the palm artificial islands



7-star hotel that looks like a sail (Burj al Arab)



Foggy skyscrapers



Indoor skiing/snowboarding hill



Me and a snowboard on the indoor hill


User group meeting with Matt from WordPress

Friday, February 22, 2008

A Real Eclipse

Two nights ago, we had a lunar eclipse here in the Chicago area, and I saw it as I was driving my Eclipse car, chewing an Eclipse gum, and thinking about the Eclipse project.

( ...can't get more loyal than that, eh?! :-P )

Here is a photo that one of my colleagues took:

Thursday, January 03, 2008

Good bye 2006-2007 look

A while ago, I read a fun book called Keep Your Brain Alive. The gist of it is that in order to maintain an optimal mental state and keep the brain on its toes, people must switch their routines often and regularly try out new things. I think that to an extent, this supports the eXtreme Programming philosophy of Embrace Change.

In any case, changing your blog layout can actually be one of these routine changes, so good bye 2006-2007 look!



For the next few days, I will be experimenting with different looks, so don't be surprised if the layout keeps changing.

Saturday, October 20, 2007

Birthday Code Gifts

Yesterday was my birthday. Here are code gifts that I got:

Ruby: andy.eat! cake -- Nick

Java: Cheers Andy! I was trying to come up with Java version of Nick's greeting, but it was already getting too long, and I hadn't even started the unit test. Shoot, I should have written it first, huh -- Fred

Scheme: (cons (car cake) andy-mouth) -- Ryan

Haskell: The Haskell version would involve asserting a world such that there is already a piece of cake in Andy's mouth. -- Fred

DHTML: And in DHTML you would set up an oncake handler for Andy's mouth. -- Fred

Thank you guys!!! Best gifts I got in years. ;)

Saturday, November 04, 2006

A plunge into the blogging world

I once read a science fiction novel called Ender's Game. Although it was written before the Internet was born, it predicated many of the things that happened post its birth. It spoke of an interconnected web of computers; forums where people communicate, and even kids disguising as adults leading online organizations and political campaigns. While the last bit may have not manifested completely yet, it is interesting how the power of imagination can predict many things far before they occur.

I am finally plunging into the blogging world because I realized that it is a great way to communicate my ideas to people, discuss them, refine them, and contribute them to the world.

This blog will be dedicated mostly to technology-related topics. However, every once in a while, I will sprinkle in other topics that are related to my personal interests (skiing, rollerblading, kung fu, snowboarding, skateboarding, psychology, philosophy, etc...)