12 Tips for People New To Software Engineering

I’ve been working in the field of software for over 16 years now. I’ve worked for small companies, and I’ve worked for large companies. I have recommendations of books to read (though I really should start a database of books). I gave a small talk a couple of days ago, and I shared some points to start with. Here are the points that I advocated:

  • Learn Version Control Software – This was something that was mentioned in college, but not really harped on. In the real software world, everything is done with version control. It allows you to track changes and see how the software is made. Learn it! Git is the most common, but there are plenty of alternatives.
  • Read Books Often – It actually doesn’t have to be books, it can be blogs and various other things. Find stuff to read and stay up to date as best you can. Software is continually evolving. As people are writing software, they are evolving the practice of software engineering. New stuff will make your life better and easier.
  • Understand Computer Architecture – At some point in your career, understanding how a computer works will help you. I have a story about a buffer overflow in Swift that wasn’t pushed back to ObjC that took me days to debug, and I was only able to solve by realizing the one device we were working on was a 32 bit device. Understanding architecture will help you with understanding performance trade-offs.
  • Everything boils down to text – Everything is text, somehow. Packets going over the internet are really just text in disguise. Websites are mde in text. Everything is text. Even images are really bytes, which is text for computers. If you spend enough time, you can understand pretty much anything. It’s all a matter of time, usually not a technical limitation of understanding a problem.
  • Have a website – This is advice from Being Geek from Michael Lopp. Create a website. It’s not super hard to do and will look good on your resume. It’s a great way to show potential employers what you have done.
  • Do side projects – They don’t need to production level projects, but doing side projects is a great way to play with technology and learn about various different things. Notice a trend here, keep learning if you want to be successful.
  • Learn as many langauges as possible – You don’t need to be an expert in all of them, but understanding the basics in many different langauges will help you. Being able to understand the advantages of one language over another is super helpful. Picking up a second langague can be hard, but if you have many languages under your belt, picking up a new one isn’t super hard.
  • Learn people skills and start networking – Even though writing software is a skill, most projects are too complicated for any one person to do. You will need to work with others. Learning to do this effectively will help your career. It might also allow you to find different opportunites that might peak your interest.
  • Learn the command line – I don’t care what system you are on, there is a command line under it. Learning the command line will help you be efficient and work on many different environments. Remember, everything is text.
  • Keep notes and records – You will forget what you wrote in less than 3 months. Notes and records will be your best resource for remembering what you are thinking. Plus you remember more of what you write down. So write things down in a way you will be able to look back on them in the future.
  • Become a power user of your software – You will spend your days using development software. Learn the keyboard shortcuts and all the tricks you can to be more effective in your software. It will help you save time, and that time will add up. It will allow you to spend more time thinking about the “what” of software.
  • Learn about testing – saving one of the best for last. Testing can be your best friend. It can help you from breaking something you already had working and ensuring your objects behave the way you expect them to. I’ve worked for companies that have done too much testing (way too much UI testing can slow down development), but if you have a question, you probably don’t have enough.

Starting a Career in Software

laptop with code

I’ve written some blog posts on getting into the business of software development before. Specifically this list of books on programming, yet I had a conversation with a young engineer the other week and it made me wonder what else I could do to people get into the field. Luckily for me, this young engineer has friends who are also in college and also looking to get some information on the field.

Now, I’m famous for saying, “I’m a Zack of all trades, master of some (really few).” The truth is, when it comes to software, I’m not a super-strong master of many. I get the conceptual idea of a bunch of it, and I’m really just an expert at seeing a problem and understanding the solution. What I’m good at is finding resources to help me and understanding what the resources tell me and translating that into solutions.

Still, when I was starting, I wish there were a bunch of things people had told me. I wish I had known that literally, anything is possible in the world of computer programming if you are willing to dig deep enough to figure out what is going on. I wish I had been told some good places to start learning. I wish I had been told that it’s okay to ask any question once, but it’s really bad to ask the same question over and over again. That it is disrespectful to go to someone with more knowledge than you without even doing a google search and bringing something to the discussion.

Anyway, these are some of the things I learned. I’m curious what the knowledge gap is between those of us in the industry and those just finishing college. To that end, I’m hosting a zoom call on Thursday, August 19th at 8 PM eastern. I’ll probably have some slides prepared, but I’m hoping that most of the session is about Q&A with questions people bring. All you need to do is join the zoom.

Pensive Ruminations about Thinking

photo by Jesse Martini

A few weeks ago a coworker implanted an idea in my brain about this concept of Second Brain. The notion is that the brain is being used in ways it wasn’t designed for and we have a ton of tools at the ready to do more than ever. The notion that we are bound by the limits of our brains is somewhat false. Knowledge and ability goes beyond the our bodies now. With the internet and the use of other information, it is possible to accomplish a bunch even without being able to remember everything.

The link above is for a specific methodology of coming to a second brain. The truth is there is more than one way to do it, and the person who is teaching that class’s big claim to fame is that class. Is organizing how to teach others to organize really success? I’m skeptical. The class that he is offering is in the multiple thousand dollar range and fills up, but I’m not willing to spend that much to learn to figure out my life.

Instead I’ve decided to start reading and figuring out things for myself. I’ve started with a book called The Extended Mind. I’m still working my way through it, but already I’m enraptured with the ideas in it. The notion that our brain does not end at the organ in our heads. The fact that our brain is an organ and a muscle like we’ve all been taught. These are all compelling notions. Taking this further than the book has so far, the mind extends to all of the knowledge that is available to us. This includes all the people we know. Our knowledge then is a shared knowledge. It makes me wonder if by the definition of the book, are humans really just one brain working together? I’m not yet finished with the book (really just starting), so these are all unfinished thoughts. I don’t have a full answer to what I think about the book and this notion yet.

What I do have a thought on is the new program that I found with a little bit of searching. It’s called Obsidian. Basically it’s what I’ve been looking for but without knowing I was looking for. It is a visual representation of the notes on your computer formed in markdown. It can sync between multiple devices (though you do have to remember to save, which is annoying). You can easily link between notes and jump to other notes. You can see the notes in a graph view and see the ones that are connected. It was created as a way to foster connection between thoughts and allow for more of this second brain stuff to exist. It stores all the data in Markdown files on disk so it is accessible at any time.

I’m definitely not using it as efficiently as I could be and there definitely is a lot of work for me to do get the organization the way I need it to be, but I’m loving it so far. Unlike Bear, it allows for complete stylesheet customization. This allows you to shoot yourself in the foot or create some cool additional features if you want. There are a whole list of external plugins as well, because it is just javascript under the hood. This is my tool. Now I just need to figure out how to get all of my old notes from Day One over and start making things better.

Also of note, because it lets me override styles, I am using my favorite MonoLisa, which allows me to do very cool arrows and various other ligatures that I really like.

Unknown how the use of this program will help me in the long run, but maybe this will allow me to create more than just my own thoughts. Maybe someday I will be able to pass on my second brain to my family and anyone else who wants it. Pretty excited about figuring all of this out.

WebDriverJs and Chromedriver

If you’re not familiar with WebDriver, perhaps you should be (if you’re a programmer). It’s a tool used for performing user tests on websites. I’ve been working on a project for testing some websites with Chromedriver, the chrome implementation of WebDriver. Once you have the driver up and running you need a way to send it commands to get it to do user actions. Chromedriver responds to simple REST requests, which, of course can be issued through JavaScript. This leads to WebDriverJS, a simple implementation of the REST protocol for WebDriver. You can use it server side, with something like node. Or you can use it client side, within the browser.

Here’s where the plot thickened for me. Normally I used to start chromedriver directly:
https://gist.github.com/2885890.js?file=old_way.sh

Once I had the server up and running I wanted to test
https://gist.github.com/2885890.js?file=run-driver(wrong).js
with the html:
https://gist.github.com/2885890.js?file=wd_test.html

I spent several days trying to get this to work. I had no success. I searched the interwebs, and came up with nothing. The solution is simple, but was not apparent. You need to run chromedriver through the webdriver shell.

Here’s the command line:
https://gist.github.com/2885890.js?file=with_selenium.sh

You also have to modify the connection javascript, the run-driver.js should how look the following:
https://gist.github.com/2885890.js?file=run-driver.js

These pieces put together should allow you to control your chromedriver.

GoodBye GoDaddy

After the whole SOPA debacle, I decided I was done with GoDaddy. Their site has always been crap. It’s hard to use and figuring stuff out sometimes takes a call to their tech support. On top of that, they had been starting to raise their prices. They used to be one of the cheapest registrars on the internet, now they were charging significantly more than other registrars.

I have been using Dynadot for a bit as they were about a dollar cheaper than GoDaddy and The Brooks Review recommended them.

As of today it is official. All my domains are gone from GoDaddy. For various reasons that I hope to explain over the next year, I have 25 or so domains. The 21 that were at GoDaddy have now been moved to Dynadot. I’m looking forward to having an easier time administering them, and spending less on them in general.

iPhone 4S Setup, a post Steve Apple

I’m sad to say that the whole process of upgrading to an iPhone 4S (or 4 Steve as some crazy analysts have been calling it), has been more difficult than I would have expected. I’ll admit that I didn’t take the most conventional route to set this phone up, but my experience has not been pleasant. I feel this is a bad sign for a post Steve Apple.

Here’s my situation. I’ve been running an original Edge based iPhone 16 GB for the past 3+ years. I was waiting for the next new iPhone to come out so I could grab one. I was very excited for the announcement of the iPhone 4S, and unlike everyone in the media, I was not disappointed. I liked the design of the 4, and was happy that they were keeping it a little longer. I really have been wanting some more storage space. I like to have a lot of data on my phone, between my huge photo library and some videos to watch while commuting. So, all in all I was really excited about the new iPhone.

Fast forward, I decide not to rush out and grab it on day one because I wanted to make sure I could get my employee discount, seeing as I work for a company that has a close relationship with AT&T. I ordered it on Sunday. That translated to roughly a week and half delay from when they first started shipping. Still, not a huge deal. It would have been nicer to know when to expect the phone instead of having to check the AT&T website everyday to see if my items had arrived and shipped. To be fair, they sent me an email after the items shipped, but not until I had already been on their website and seen the tracking number.

So the phone arrives last night.

Since I ordered it from the AT&T store, I don’t have AppleCare+, because they didn’t have it when I ordered it. So I stopped by an Apple store on the way home, but they don’t carry +, so they advised me to call. I did, but they were closed by 8, despite the fact that a gentleman on the phone said they would be open until 9 PM PST (The representative I talked to on the phone this morning confirmed this). I tried back twice because I didn’t believe them, still closed. The guy at the store tells me that it’s not going to be an issue if I open my phone tonight, though (he was right about this part).

So I go home and unpack the phone and start setting it up. I’ve been reading on the web that there have been a few issues setting up a new phone based off an existing phones backup. To try and avoid these concerns, I initially decided to try and load my iPhone as a new device. I set it up, and got it running. Was playing around for a bit and then realized that I have tons of data on my phone, like SMS messages and other information.

I woke up early this morning and decided I’d try do it the other way. I went through the process of restoring the iPhone as my old phone. This process only took about 15 minutes and looked to be working pretty well, until I tried to use Siri to set a reminder. It said it couldn’t.

I had to call in this morning to AppleCare to get my AppleCare+ thing taken care of, so I figured I’d ask them about it. It seemed to be related to my iCloud settings. Couldn’t figure out exactly what it was, figured Apple would be a good option in finding an answer. Nope.

I first called in with my serial and before I could even say that I was calling to buy AppleCare+, the representative was on it, and said that I was eligible. I told her that was why I was calling, and she took my credit card information. I didn’t think of it until after, but she never stated how much she was going to charge me. I asked afterward, she said the product was $99, and there might be tax and it could be up to $5.25, but she didn’t think there was. She was VERY polite and kind, but not knowing what you are charging me does not seem right to me. I digress.

I told her I was having issues with iCloud. She walked me through the basic steps of setting up the backup and I kept getting an error message. She put me on hold several times throughout this process and was still unable to help me resolve my issues. Again, she was VERY polite, but did not seem to be able to help.

Finally she gives up and schedules me to talk to an iCloud specialist. Not a huge deal, but the first thing she tells me is that the specialist is going to call me, but when I ask her when, she tells me she doesn’t know. She put me on hold, again, and comes back several minutes later saying that I need to call a specialist. I say, that’s fine, what’s the number and when should I call? She puts me on hold again, only to come back and say that the system was down and she will have to call me back.

When I speak to the specialist, he was very kind, but did not seem to understand the problem I was having. We went through several phone calls, as he required me to have WiFi, but I was out and so did not have access to a WiFi connection.

In the end I spent some time debugging it. It was clear that reminders wouldn’t work if they were turned on in iCloud, but they would work just fine if iCloud sync was off. I went to go look at my calendars and that wasn’t working correctly either. When I went to my .mac account on my phone, asked me for my password. Once I entered that and turned on cloud syncing everything started working.

Also of note, Syncing with iCloud and backing up to iCloud are two very different things. Syncing means having your contacts and mail and calendar on the iCloud server. Backing up is a full device backup. A better explanation of that would have been helpful.

In the end I feel like there was just too much confusion with the setup. Most Apple products have been very plug and play. This device required some serious setup to get it the way I wanted, and it was not clear how to get there. I’m troubled because I’m pretty sure Steve would have taken some peoples jobs over how bad this process is and I’m not convinced Tim Cook has the same mentality.

Initial Kindle Experience

My family gave me a Kindle for my birthday, and while I haven’t used it too much, it is starting to become a device I use more and more.

The big problem for me is the cost of digital books. I have a huge library. I’ve spent lots of money on books over the years. Mostly tech books. These books were expensive to buy for stacks of paper, roughly $30 a piece (some more, some less). The problem is that I don’t get a digital copy of the material when I purchase the book, so if I want to read the same book on my kindle I have to buy it again (usually spending another $30).

My largest gripe at the moment is that some tech books cost more digitally then they do for physical copies mailed to my house. Here’s an example:


Other than demand setting price, I see no reason for this. How can a book cost more than $3 dollars more for the digital copy? The costs are so much cheaper with digital copy.

Physical Cost Digital Cost
Paper Formatting
Printing Network Bandwidth
Binding
Shipping
Storage

The digital costs aren’t completely invisible, but they seem to far undercut the physical costs. It makes no sense to me why the kindle edition would cost more.

My other major concern with the kindle is that I could not find any easy way to read the web content I wanted to read on my device. That was until I found the Instapaper App. Converting HTML to mobi is not the easiest thing in the world, and the kindle at the moment has a very interesting way of reading web content. Saving a link with Instapaper and transferring it to the kindle makes it incredibly readable. Problem solved.

I think the kindle has been quite successful for Amazon, and I think it is useful. I think it would be better if there was a better way to get started. Apple does this well with their products and I think Amazon is just a step behind. The Kindle has a ton of potential, but it is just shy of that stickiness factor that products like the iPad have.

Sleeping your Mac with a Microsoft Ergo 4000 Keyboard

One of my friends, who will remain nameless for the purpose of this discussion, convinced me start playing around with a Microsoft Natural Ergo Keyboard 4000. I got one at work, then I bought one for the home and I’ve been pretty happy with it. There are just a couple of things missing from my standard mac keyboard.

Firstly, on my old computer, I used to be able to hit the a keyboard combination to get my machine to sleep. I believe it was something like Cmd – Shft – Eject. Well, the Microsoft keyboard doesn’t have Eject. So I’m out of luck there. It does, however, have a set of buttons reserved for favorites. So I decided to code up a little AppleScript and bind it to one of these keys. Here’s the script, and I just saved it as an editable application. Then you can go into the preference pane for the keyboard and assign the whichever key you want to this script. Good luck.

1
2
3
tell application "finder"
   sleep
end tell

OmniFocus vs. Things (continued)

A while ago I wrote a post about my switch from OmniFocus from Omnigroup to Things by Cultured Code. Both do pretty much the same thing: allow you to make lists of tasks so you can keep track of what you need to get done. Each has their own feature sets. I originally bought OmniFocus, but after some time switched to Things. It’s a great App, and they have an iPhone version that is pretty handy. I work on a PC during the day, so it makes it a little hard to use Things as my primary means of tasks, but I use it for my secondary items.

The real motivation by this revisit is to mention how the Apps have been coming along. Things is the primary product of Cultured Code, whereas OmniFocus is one of several Apps produced by OmniGroup. This has lead to a more rapid development and, in my opinion, a more refined product. Things for iPad was released on the same day the iPad was. OmniFocus for iPad is still in developmental stages. Now, I don’t yet own an iPad, but I’ve looked at the online videos for both OmniFocus and Things and I’m a little disappointed in OmniFocus. I feel like their icons aren’t at the same quality level as Things. Their App feels less refined and it doesn’t feel like they are using all the screen space to it’s fullest ability.

As a little tangent, I’d like to mention that OmniGroup used to be my favorite company. I LOVED OmniGraffle when I was in college. I used it for most of my projects. The new version of OmniGraffle just doesn’t feel right. There are too many features and it is hard to find what I’m looking for. The interface doesn’t really make sense to me. I had this issue the other day when I was trying to set the background color of a canvas. It was not intuitive. I’m very interested to play with OmniGraffle for the iPad and see if the reduced screen and processing power has gotten the company to focus more on a core set of features, thus making the App easier to use.

In conclusion, I’m getting Things when I get my iPad, and I don’t know how much of a market OmniFocus will have.