Google+ Badge

Saturday, February 19, 2011

Technical challenges when switching jobs

I changed jobs in October for the better. The old place was full of politics and alcohol. Since I have a family and don't have time to drink every night after work I really did not have a chance to move up and I got tired of doing the work but getting none of the credit because I was not a drunken sod. Add to that the anti-Java mentality and it became a hostile work environment. In the 14 year history of the company a Java developer was never named employee of the month even though the Java product was around one half of company licenses. The other half of licenses was based on the C++ product.

The new job pretty much involves getting work done which I really like. Of course it has been mentally challenging for sure. I worked at the old place for 4 years so I knew the software inside and out. I had pretty much rewritten a good portion of it before I left. It needed it in that there were performance issues, the code was not using Java Generics and it really was not very object oriented. If I never see code like parent.parent.parent.parent.setEnabled() again that will be too soon. You may laugh but this was all over in the code and you never knew what each parent happened to be but pretty much everything had a variable named parent.

Previously it was all Java all day with just a little bit of C# mixed in for some utilities I wrote, just to keep my skills up, they could have been written in Java.  Later there was more C# done very poorly by a new team.

Now I program in Java using MigLayout and JIDE on the main application, Java using the Android SDK, Objective C for iOS, SQLite on both Android and iOS and HTML on the iOS. On a lot of days I switch between all of them. Plus I am learning a new industry and a new Ruby based server. When I see a combobox I know how to fill it in but I may not understand the data. I will see a name of a file in the source tree but I might not know how to get that dialog to appear when running the code. I also use multiple IDEs - Eclipse, IntelliJ and XCode.

Honestly just switching out one language, server API or IDE can wear you out but to do them all at once is a shock to the system. The other team members know the server, IntelliJ and the main Java stuff very well so I can always ask for help in those areas and they gladly offer up advice. The code is well written and has been easy to jump in and be productive. I came from 4 SPACE indent and braces on a separate line to 4 SPACE indent with braces on the same line but that seems to toggle every job I take and it just does not bother me.

On the Android side one team member has done a little work there and he wrote the base of the application I am working one. It is great to have the server communication in place. I have polished up the UI and am now working on the next major enhancement. He is a great sounding board for ideas as he has used the API.

On the iOS side no one but me has done anything. The guy who wrote the initial application left to start another company. The code is oddly written and not commented. I have cleaned it up the best I can, have commented it and have addressed the open bugs. I end up on Google searching a lot during the day and don't always feel very productive.

During the various interviews for other companies I got turned down because I did not know SQL well enough or I had not written a full blow application using technology X. I have worked with a number of excellent programmers and I know technology can be picked up rather easily. Once you are at a company you will almost always have to learn something new. The new place gave me a chance because I had solid Java skills and was willing to give the other stuff a shot. The other team members did not want to mess with iOS but I figured what the heck. I don't revel at the thought of coding with Objective C in Xcode but I am learning a lot.

The SQL barrier always annoyed me. I was told after numerous job interviews that they wanted someone with more SQL skills. I was probably too honest in the interviews about my skills. I don't like to oversell. I know SQL but I am no master. I am not the person to go to for performance tuning on a query. I can't rattle the benefits of inner and outer joins. I can read the code, I can query the data but I have had a DBA get things set up. I enjoy GUI programming much more than server side programming. When I asked how much actual SQL a developer wrote during a week they would admit there was not a lot. You were mainly using what was already there, just like I do pretty much every place I have worked. They just had this desire for everyone to be an expert in it. Companies need to wake up and hire excellent programmers not just people who hit a check list. I would not want to be hired as a DBA but that was not the job description. Their loss.

I am using SQLite on both the Android and iPhone side. Granted this is limited SQL work. I am not setting up a huge number of tables with indexes out the wahzoo and joins all over the place but I have designed the tables and wrote all the code to manipulate them. I had to look stuff up on Google to find out the limitations of SQList and its syntax heck I even had to look up some very basic syntax. I have used ADB on the Android side to verify my table columns and rows. None of it is rocket science and really this is some of the easiest code to write. Doing multi-threaded GUI programming is much tougher.

On the IDE side I enjoy IntelliJ. Past experience had it running too slow but that is not the case today on the faster hardware and improvements they have made. I have written a plug-in for IntelliJ to verify MigLayout code. I use the Eclipse key mapping so I can switch between the two with ease.

I now have Eclipse set up to work nicely with the Android SDK. You can do Android work with IntelliJ too but I find Eclipse to be the IDE of choice on that side of the house. Mainly because Google does the plug-in for Eclipse and keeps it up to date. I am using 3.6 with the Android source installed so I don't have the code assist slow down issue any more. I have a Samsung Galaxy S phone and I use three flavors of the emulator - 1.6 lower dpi, 2.3 matching my phone dpi and Samsung Tablet. Seems to let me test things and solve any "fragmentation" issues. I also have the emulator set up for the BA I work with and the QA team.

For the Mac I have a Mac mini running a 20" screen. I only have one iTouch authorized to run code and QA has that most of the time. You can look other my other posts to see the fun I am having trying to get another device provisioned. They are going to buy me a MacBook Pro soon so I can do more Mac experimentation at home. I recently upgraded to Xcode 4.0 which is much nicer than the 3.x series. Still my least favorite IDE but I am getting better at it. It just seems a few years behind both IntelliJ and Eclipse. Part of the issue is Objective C - it is C based making it harder to write an IDE. You can even see this on the PC side, it is more difficult to refactor C and C++ code than it is for Java code. The rest is Apple being the only IDE game in town. If there were competition in this area on the Mac I am sure things would improve.

I will get into a groove on all the areas listed in due time. Right now on Friday's I come home mentally fried. On the main Java app I am pretty sure of what I am doing. JIDE has very nice controls. I have used MigLayout in the past and prefer it over any of the Java layouts. The rest of the coding is pretty straight forward.

Android is going nicely but there are some speed bumps. I find answers pretty quickly on-line. The official Android docs could use more examples but have solid content. I can almost always find sample code on Stack Overflow. The API is well laid out and method names make sense. I know Eclipse so moving around in the IDE is second nature. I can put the app on any phone with ease, people walk buy, I plug it in, press run and it is on their phone. Love that.

The iOS side gives me the best and worst feelings. I feel a real sense of accomplishment when I get something to work because it is a more difficult to do for me on that platform. The worst is that I am never sure if what I did was the right thing. Did I release the memory properly? Did I use the right API calls? Did I write code where there was an existing API call I could have used? Some of the calls see so crazy, such a trimming a string, that I feel there has to be a better way but usually there is not. You get to the point of diminishing returns trying to look up better ways of doing things.

Having a Mac available at home is going to be a big help. I can experiment with the OS, install some tools that will make things easier, learn the keyboard shortcuts and play around in Xcode giving me a chance to experiment with one off projects just like I do on the Android.

The job switch has been worth it. I feel a weight lifted off my shoulders from fighting the management. Now I am fighting technical challenges but that is OK. That is something you can beat over time. Electrons don't harbor crazy thoughts and follow illogical rules. Get it working, get it shipped and get started on the next version. Working with sane people is so nice.