For the better part of my software development career so far, I’ve had the doubtful pleasure of being one of the devs using and maintaining our in-house web development framework. Framework coding is a bit different from the actual application development. At the core it’s a simple idea: you have a whole bunch of code that helps do programming tasks that you expect will often be necessary in a certain set of projects, so you write that code with the intent of reusing it across multiple projects.
“We will encourage you to develop the three great virtues of a programmer: laziness, impatience, and hubris.” — Larry Wall, Programming Perl (1st edition) Hubris is a fancier word for an excessive sense of pride. Why is this to be considered a great virtue for a programmer? Programming is at least partly an act of creation, which means there is an element of craftsmanship involved. A craftsman imbued with hubris is able to take pride in his work – he is driven to create work that is the best quality he can provide.
… especially for strongly-typed languages. In one of the bigger Java projects that I took over, I was often annoyed to find some devs had written method signatures like public void doTheThing(HashMapparams) Which is silly – not because of the naming, that’s obviously not a real-world function name. The silly part is requiring a particular implementation (HashMap) instead of the generic interface (Map). It unnecessarily restricts your API and makes it less flexible.
Overhead scale up rapidly as project team size increases. Every time you add a new person to the team, he comes with a lot of overhead such as the need to learn the project details, responsibilities of other team members, who to consult when there’s trouble, custom project procedures, and so on It’s a reinforcing cycle too. As overhead increases, the team imposes more processes and restrictions to make sure everyone is doing the right thing and there are no screw-ups.
Overtime in software development projects seems to be a given. Sure, there are projects and companies that don’t need it, but those feel like the exception rather than the norm Overtime in software development is a natural consequence of schedule pressure and the fact that estimation is hard, which is why it’s understandably common, but that doesn’t mean we shouldn’t try to avoid it More than once I’ve been in a situation where the team stays overnight to try to get a build or release ready for the next day only to run out of time and have to delay the deployment anyway.
A while back, news came out that an AI was able to perform a diagnosis after the human doctors were stumped. Having just finished binge-watching the entire run of Star Trek Voyager, I immediately thought that was the sort of AI advancement that could lead to such things as Voyager’s Emergency Medical Hologram, an AI which could replace a human doctor. Of course, it is still very unlikely for this to happen anytime soon, medicine is a very complex field and new things are still being discovered all the time.
Without a doubt, the number one problem in software development projects is schedule pressure, that is, the pressure to meet unreasonable deadlines and targets Almost all other problems can be overcome if there were no schedule pressure: weaker developers could be mentored to become better, more productive, and commit less faults less faults overall will be committed anyway if there were no schedule pressure poor requirements could be threshed out in more detail difficult clients can be argued, worn-down, and eventually reasoned with problematic team members can be counseled, or replaced with new blood and so on But of course, the reality is that we live in a world with deadlines and targets, many of them set by people who have no idea about the complexities of software development.
Estimation is hard. Estimation has long been the bane of many software developers and software development projects. But there are two secret ways to be able to produce perfect estimates for software development work all the time! One is dependent on talent, and the other is dependent on technology Psychic precognition, i.e. be able to predict the future Have a time machine, so you can go back in time and tell yourself how long the work would have taken Such precognition is necessary to have perfect estimates because of all the unknowns present at the start of a software project.
I like to say that software development is a challenging career because no two projects are ever the same and there are always new challenges to face and new concepts to learn, but the truth of the matter is a bit more complex. Writing software is about breaking down large problems into a series of very small technical problems for which we already have solutions. Examples of small enough technical problems include list sorting, comparison, arithmetic operations, path traversal, string concatenation, returning a string as an HTTP response, rendering text to the screen, retrieving submitted parameters from an HTTP request, and so on.
I was originally going to write a post about the problems development teams face as they get larger, but the section on development standards was long enough by itself so here we are. Having some sort of development standard in a project development team becomes a lot more important as project size goes up (for obvious reasons). There are different kinds of standards to consider, but generally I break them down into design standards and coding standards.
Pros: It is a very rewarding career financially. Software development often ranks in the top 10 highest-earning careers in most countries There is a lot of scope – you could be developing web applications, mobile applications, embedded applications, client-side, server-side, data analysis, artificial intelligence, games, etc It is very difficult to be bored. You can always automate away the boring stuff. Different projects always present different challenges. The field is evolving rapidly so there are always new things to learn.
Evaluation of programmer performance is notoriously hard. You want to be accurate and at the same time fair such that all programmers on your staff are evaluated in the same matter. However, there are no good, objective, universally accepted standard metrics. It follows from the fact that there are no good, objective, universally accepted standard metrics for program size. Typically each programmer in a team will not be doing the same task or even the same type of task, so in order to produce fair evaluations you will need some standard metric of program size to normalize any evaluation.
****Since I wasn’t a graduate of computer science, there were many concepts of software development I really only got exposed to when I started working. One of those was the concept of a relational database, and hence SQL. The company I worked at gave all new hires a training regimen that started with about a week of SQL. Despite not knowing anything about it beforehand, I took to it like a mouse takes to cheese.
I never really put much stock in certifications. I felt that they were no guarantee of knowledge or expertise, and that many people who did have knowledge or expertise wouldn’t necessarily have a certification to say so. Add to that it often seem overpriced to even apply for the certifications, so I didn’t have a high opinion of them. That being said, I have had the opportunity to take professional certification exams twice in my life (both luckily paid for by my employer at that time).
A friend of mine had an informal consultation with me the other day (read: asked me questions over FB messenger) about what their IT staff was telling them about a file upload vulnerability that had been recently exploited in one of their applications. Obviously it was difficult for me to judge given that I didn’t know all the details, but for me it was most likely a vulnerability introduced in the application code itself.
Some time ago, one of my many intrepid followers pointed out that this blog tested poorly on web page performance according to this Speed Testing Tool. Now, I’m of the opinion that for a personal blog such as this, web performance isn’t really a mission-critical sort of thing, but as a software developer who has often had to work hard to optimize the web applications we delivered to our clients, it kind of became a matter of pride :pUnacceptable!
I had my first taste with working with software testers during my first project where I was involved with porting an old system to a new version of the software. My first task involved porting reports which were to be generated by the users then printed out. The task wasn’t too difficult: basically you took the source code of the report (it was some weird binary format recognized only by the particular reporting tool – that was how it was done back in the day) and open it using the newer version of the tool, and the tool did some sort of migration magic to adapt it to the new format, then you just save it back again.
In the modern era of online services and applications, it is getting more and more common to hear of databases and systems being hacked and user data being exposed. The most dangerous of this data is the user’s password since it may allow access not only to your own service but to other services as well. As an application developer, the below is probably the bare minimum you need to know when handling user passwords:
More stories from the early days. Evaluating someone’s programming ability is hard, especially someone fresh out of college. A student’s grades is in no way indicative of how well he can program after all. So most nontrivial programming jobs have some sort of complicated application process involved. I remember going in and taking an exam. Most application processes will have some sort of written exam to filter out people who look good on paper, but can’t actually do anything.
A while back I answered a question over on Quora about how I got started down the path of programming. It’s not a particularly interesting story, but I still thought I’d record it here for posterity. Sometime when I was much younger, maybe somewhere between twelve to fourteen years old, I remember having some sort of QBasic programming learning book at home. I forget how we got it, I think my uncle brought it home for me sometime for some reason.
Stack Bragger lets you brag to your Facebook friends whenever you ask new questions or earn new badges at StackOverflow, SuperUser or ServerFault. I was looking for a weekend project and found out that stackoverflow api was released so I thought I’d make a small facebook app. I originally just wanted to post to FB whenever I got a badge, something like how PSN accounts automatically post Trophies to FB. It also posts questions you ask so that any friends you have on facebook not already using stackoverflow might want to help answer 😀
I got tired of having to maintain my own comment moderation system, and I decided against throwing out the django code and going back to wordpress. Instead, I’m migrating the comment system to DISQUS. I love this little mess of django code that’s running my blog. I wish I had time to clean it up. But for now, at least I can have a more industrial-strength comment system in place.
I’ve been meaning to write a nontrivial app using Google App Engine for a while, and here’s my first weekend project: Decklist Sharing Tool, an tool for MTG players to share decklists online. I had the decklist parsing and autocarding code available for a while (and used on my MTG related posts), so that part was fairly easy, I got it done under 3 hours I think. The rest of the time (around 5-ish hours) was spent on glue logic, fixing minor bugs, working on HTML layout, cleaning up text, etc.
You may have noticed the new color scheme and new “Theme Switcher” widget in the sidebar. I had done some CSS work during the past month in the office and it made me want to tweak the stylesheets on this site a bit. I figured I might as well make it easy to switch stylesheets, so I wrote a small Theme Switcher django app. (Well, it’s more of a stylesheet switcher I guess)
Excellent talk given at the Canadian University Software Engineering Conference (CUSEC) last year (2008). The presenter is Zed Shaw who’s a famous Ruby guy or something. The video is around 70 minutes long. The first part of the talk is mostly about a Document Management System he worked on, kinda interesting, but the second part is better where he talks about people who program cool things as a hobby and how to avoid becoming just another corporate code.
I was doing code reviews on an interface file-processing framework to be used in one of our projects. The code was workable and already being used by several programs, and I didn’t see any major functional flaws. But design-wise I felt that it could stand for some improvements/refactoring to be “better object-oriented code” or “easier to maintain”. The current design required a lot of inheritance – the usual way of doing things in older Java code at work.
I actually had some trouble using django-pingback on my custom blog engine; the django-pingback documentation is mostly fine, but there were some caveats that I had to discover myself through a bit of debugging: The URL specified for the XML-RPC endpoint in the HTML head needs to be a full absolute url including domain, i.e. http://roytang.net/xmlrpc/, which gave me trouble when I was trying to test using localhost pinging to an online server.
For the past few months, I’ve been encountering the COM Surrogate Has Stopped Working Error in Windows Vista, as described here. Unfortunately, most of the recommended fixes on this page didn’t work for me. (I had neither DivX nor Nero installed, etc.) Eventually, I had to download InstalledCodec and use trial and error disabling of all the codecs in my system to trace the problem. I narrowed it down to the Xvid Codec and ended up having to disable it.
My current blog app supports syntax highlighting in the blog posts, something I cribbed off Djangosnippet #119 One problem I encountered was that there was no quick visual reference for the styles available with pygments, so I wrote a short demo page here so that I could easily see the appearance of each syntax highlighting class. Of course, I haven’t had a chance to use it in a post yet…
I played around with the built-in comments app today, trying to clean it up. Some findings: Some of the moderation views, such as flagging a post or deleting a post, accept a next parameter that determines where the view will redirect to after the operation. However, the way the url’s are set up, there’s no easy way to pass this parameter normally, even through query strings. THis lovely bug is documented in http://code.
I’ve been busy at work so fell a bit behind with Django. Last night I worked on a WordPress importer, so that I could migrate posts from my current blog(s) into the Django-powered blog that I’m coding. I’m using BeautifulSoup to parse the WordPress export file and insert them as Django objects. Since I was running the script repeatedly, I had to figure out how to easily run it from the command line, without having to run it from inside manage.
21112008130.jpg Originally uploaded by zroytang A while back I got an email telling me that Adobe was sending out free Flex T-Shirts to people who had contributed to Flex 3. I had reported a few bugs on Flex JIRA, apparently that was enough for me to get a free shirt! The picture here shows the back of the shirt, the front just has a small Adobe logo.
I wanted to add some basic tagging to my blog app so I tried out django-tagging. Unfortunately, the featured downloads on the Google Code site are quite out-of-date and would not work with Django 1.0, so I did a subversion checkout instead. If you’re getting an error like “ImportError: cannot import name parse_lookup”, then you need to get the source code from SVN. Adding the tagging to the blog was pretty easy:
… and now it works! http://www.randomencounters.bells-n-whistles.net/blog/ I think the apache service needed to restart mod_python or something… (I don’t have SSH access so… )
So I got a basic blog app up and running. Posting, paged archives, etc. Comments implemented using the django.contrib.comments. No problems here, the only caveat being most of the current documentation found by Google searches refer to the pre-1.0 version. Need to peruse the official docs for 1.0 stuff. RSS feeds implemented using django.contrib.syndication, this one seems fine. I tested it and it’s running fine on localhost. I also have a free django hosting account at http://bells-n-whistles.
My dad asked me to help book a flight from Manila to Boracay for my uncle who would be a balikbayan this weekend. The rates at PAL were better, so we decided to book using their website. I did the search for the flights, booked the seats, input my uncle’s details, etc. When we got to the screen to input the credit card info, my dad went to call my uncle to confirm and to get his credit card.
“when redirecting, how can I make the redirect URL decoupled from the urls.py of the parent app?” -> It turns out that HttpResponseRedirect supports relative paths, so this was fine. return HttpResponseRedirect(“../” + str(post.id) + “/”) I got the basic posting structure up. /post/new/ -> To make new posts /post// -> To view a single post /post/all/ -> To view all posts I should probably start thinking of a better url scheme.
The quintessential app to learn from is of course a blog. Started using a simple Post model. Added the new post form and view. Can now successfully insert posts into the DB. Next: – create the detail page that will show the post after saving Figure out: – when redirecting, how can I make the redirect URL decoupled from the urls.py of the parent app? i.e. if the parent app has the following mapping:
I was looking to try out some Flex stuff at home, but of course I didn’t have a personal Flex Builder license I could use. (A coworker of mine wisely advised me not to try using my work license at home.) So I looked around to see if there were any free (as in beer and as in speech) alternatives. The one I found was FlashDevelop. Although the IDE looks Eclipse-like, it’s actually built using .
I was registering for an account at a local auction site (which shall remain nameless), the zip code combo box threw me off: Comments Comment by Bry on 2008-08-26 00:55:11 +0000 It’s actually displaying the ZIP codes of locations in Quezon City in alphabetical order. I think the dev forgot to put the location name somewhere there e.g. Alicia (1105) Amihan (1102) Apolonio Samson (1106) and so on…
In my continuing quest to become better than everybody else, I spent some time today learning Django (a Python webapp framework) and the Google App Engine. I tried following the tutorials included in the Django Book for a while, but I’ve never taken too well with just typing up examples from a book, so I decided to write something from scratch. I decided to write a simple message board application.
Upon the prodding of Mikong, I attended the recent Barcamp Manila held in Ortigas last Thursday. I wasn’t really sure what to expect, as I’ve never attended any such conference before, and I’ve never been particularly involved with the local developer community, but I said I’d go anyway, I figured it’d probably be fun. The event was held at the Orient Square building at the offices of Exist Global and Morph Labs, who sponsored the event.
 Blogged with the Flock Browser : http://alistapart.com/articles/survey2008 “”
I joined this year’s Google Code Jam. It’s part of my characteristic competitiveness and arrogance that I actually imagined I had a chance at winning the contest. No such luck, see my results. I was eliminated in the second online round. That I managed to get there at all was surprising considering the level of difficulty. I’m not really a com-sci guy, so I’m weak with regards to algorithms, I don’t always know what the best approach for particular classes of problems – I usually just brute force it then try to optimize based on my on-the-spot analysis of each problem.
Google started a treasure hunt about a month ago, releasing four questions (one per week) that covered a range of computational topics. I actually joined the treasure hunt late, the 2nd question was already released by the time I got wind of it. The site says there are prizes to be won for the people who are able to provide complete answers first; I’m not sure what my odds of winning anything are since (a) I joined late and (b) I can only do the questions during the weekends, typically a few days after they are released.
Part 1. Part 2. Moonglove Winnower template is currently live on Roy on Magic. I made several color and formatting changes since the last update. Relatively easy due to the stylesheet. I also had to scrap the CSS hack for implementing equal height columns, it was causing problems with anchors in the URL. I went with a 1-pixel high background image instead. Currently most of the PHP logic/heavy lifting is done in sidebar.