I recently read this article on the need for non-software companies to recognize the impact of their internal software development. It reminded me a lot of where I work. The general culture at my workplace says, “We are in the x business. We don’t do software.” The idea being we buy software at every opportunity and only resort to developing it when we have no other options. The result is a lot of money thrown at very expensive software packages which hardly do what we want after we fight with for a year. There has been a recent move towards using open source software over in-house software, but it still suffers from the same problem. The result is we do not apply as much emphasis on developing our software development environment as we should. Afterall, why bother modernizing if you only write a handful of apps never intended to see the light of day?
The refusal to address our software problems is only making matters worse. While commercial products often do meet our basic infrastructure needs, they do not and cannot come close to making us a successful business. The result is we implement the software closest to the core of our brand in-house. As time goes on, we continue to build applications on top of past applications. However, many of our past applications are outdated or were quite possibly outdated the day they were created. We continue to incur debt. Quite frankly, we are falling behind. Old applications need renovated. Current applications need modified. New applications need developed. All the while, we use yesterday’s practices because we do not have extra time to learn modern techniques.
Nearly every business today does software. Particularly if a business provides online services or makes transactions, it needs to consider itself in the software industry. Take a look at a company’s income and see how it aligns with spending on development resources. If a large percentage of revenue comes from areas supported by in-house developers, this is a good suggestion the company is in the software business. They need to put effort into improving and supporting their development efforts because otherwise their software debt will consume company expenses.
I have spent the past six months trying to learn to balance today with tomorrow from an IT perspective. Today is about providing solutions to problems one has today. Tomorrow is about solving problems one will have in the future given their current situation and direction. The purpose of IT is to support business. While IT for IT’s sake is fun, it does not provide real value. Aligning IT to solve business problems is key to success. When business has an idea for a great new product, they need a solution to implement the product. By spending large amounts of time implementing the perfect solution which is robust, but easily adaptable to any direction the product may go, the business may miss out on its opportunity to capitalize on the full potential of the product. However, implementing the quickest solution to get to market as fast as possible can leave the product unable to adapt as customers begin to request new features. Balancing these two sides is key to the success of IT.
My company is very oriented towards today. They want a solution as soon as possible. Cleaning up the aftermath is left for tomorrow. The problem is tomorrow quickly becomes today and new problems need solutions implemented. Too often, no time is left to prepare for tomorrow. Frequently, we find ourselves wasting time today because all we thought about yesterday was yesterday’s problem. One example is the vast quantity of processes we have today with their own implementation to FTP files. FTPing a file is a fairly simple process and easy to implement. As a result, any time we needed to FTP file, we implemented it for our specific situation. As a result, we have never created a generalized process for FTPing files. Implementing a new specific solution always seemed easier than trying to make something more general and reusable. However, when looking back, we would have been better off creating a generic process to FTP files and reusing it as necessary than implementing one for each specific situation.
As a counter to my company’s constant band-aid on top of a band-aid approach, I repeatedly voice a need for general solutions which can be reused. However, it is not uncommon for me to find myself in a situation where there simply is not enough time to develop a generic application over a specialized application. Sometimes, we simply do not understand the domain well enough to generalize. If we tried, we would likely spend a lot of time creating a process that really is not reusable. As a result, we would need to spend more time reworking it later.
The result is we need a mixture of today and tomorrow. When time is of the essence, we need to create a solution that meets the requirements. That being said, we also want the application to be designed to be easily changed down the road. Then, as additional requirements develop, we modify the original application to meet the expanded scenarios. The result is something akin to agile software development practices. The key is to allow time to refactor the original application. If the requirements are moderately different early on, it may be more work to adopt a common approach. However, as the area matures, the small time spent upfront will begin to be returned. Fortunately, the time spent at the beginning of the process is not too great to warrant a large risk of wasted time if the product flounders. In essence, we need to meet today’s problems by adapting yesterday’s solutions to be prepared for tomorrow.
Tonight I needed to mount a share from my host OS to a VirtualBox virtual machine (vm) running JeOS. To get the job done, I had to mix a few different resources so I figured I would make a nice compact guide here.
- Create the VirtualBox share. I believe the virtual machine is supposed to be turned off for this step, but I do not know if it actually matters. I did this using a GUI, but it is my understanding you can do it with this command (JeOS – name of vm, share – name of share, /home/your/shared/folder – path to shared folder, backslash – entire command should be on a single line):
VBoxManage sharedfolder add “JeOS” -name “share” \
-hostpath /home/your/shared/folder
- Install the necessary tools to compile the kernel modules that are a part of the Guest Additions:
sudo apt-get install gcc make build-essential linux-headers-`uname -r`
- Mount the Guest Additions iso. First, make sure it is set on the vm’s cd device. Then, simply run this command:
mount /dev/cdrom
- Install the Guest Additions. Please note the specific file run may be different depending on whether the guest OS is 32-bit or 64-bit. Here is the command for 64-bit:
sudo /media/cdrom/VBoxLinuxAdditions-amd64.run
- Reboot the system:
sudo reboot
- Make the directory which will be the target of the share mount:
mkdir /home/your/target/folder
- Mount the share (share – name of shared folder):
sudo mount -t vboxsf share /home/your/target/folder
Voila! The share is now mounted in JeOS. I ran this on an Ubuntu 9.10 Karmic Koala 64-bit host, Ubuntu 9.10 Karmic Koala JeOS guest on VirtualBox v3.1.2. For the purposes of my vm, I did not want a compiler left on the system; thus, I removed everything I installed with this command:
sudo apt-get purge gcc make build-essential linux-headers-`uname -r`
Here is the list of guides I referenced in figuring out the process:
Inspiration: “Brick by Boring Brick” by Paramore
I grew up listening to stories about King Arthur, Davie Crockett, and Paul Bunyan. From there I began reading about Crusades, Roman Legions, Samurai, and World War II platoons. I played Final Fantasy videogames and lived in a world that was all my own. I had an active imagination as most kids do. I became enchanted with the ability to mix history into the stories of our fictional media. It made them seem as if there was a chance they could be real. After all, Medieval stories are full of dragons and demons despite being based on factual events. Is it so hard to believe that such a story as Final Fantasy VI could have truly happened with some slight modifications? I know it did not, but the historical traces laced throughout give it the credence to allow our minds to be encaptured.
Object-Oriented Programming is all about conceptualizing real-world objects in our code. However, I find it helpful to keep in mind that the objects we create are simply abstractions. It is simply a collection of instance variables of various data types and functions. Functions themselves are simply a data type themselves whether or not it is in explicit in your language of choice. This means that an object is nothing more than a hash.The result is, with the proper language, a programmer can make objects and classes in his own manner. It is simply a matter of mapping hash keys to their appropriate instance variables and functions.
If you want to take it further, eventually, each composite data type can be broken down into a scalar value. Then a scalar type really is just a series of bits. Your kitchen spoon is nothing more than ones and zeros in the mind of a programmer.
When it comes to information technology, big companies are slow. The cause of this is all the structure added to prevent someone from breaking the entire system. It is a ton of overhead plain and simple. Remember when people used to write code, compile it, run it for five minutes, and call it a new version? When developing for a large company, the maintenance cycle is a little different. A user finds a bug and calls tech support. Support confirms the bug and reports it. A resource manager assigns a priority to it and puts it in a queue for a developer. The developer gets to it after finishing all the other tasks in front of it. He fixes it and performs some very basic testing. Then the QA resource gets their hands on it for regression testing. Finally, the new code is pushed out in the next deployment. Then another user finds a new bug and the process repeats.
There is a benefit to all of this overhead. It becomes very difficult for an individual to accidentally break something. There is a cost to all of this overhead. It becomes very difficult for an individual to intentionally fix something. When does the need to create something new override the need to prevent something being destroyed? I believe those of you who have written code in both Java and a scripting language such as PHP or Ruby understand what I am talking about. There is something to be said for preventing stupid mistakes. It also happens to be true that when challenged, someone will step up to the plate and still manage to find a way to break things. At what point do we assume people are smart enough not to let stupid mistakes get into production so they can focus on enhancing a product rather than processing red tape?
When it comes to application security, no one can ever guarantee their application is one hundred percent secure. They can only mitigate the risk in the most effective means possible. In the security industry, cost and usability are the primary factors. A similar parallel needs to be considered in software development lifecycles. No one can ever guarantee their application does not have a bug. They can only mitigate the risk in the most effective means possible. The primary factors here seem to be cost and maintainability. On one extreme, we could allow code to never be changed. The good news is everything that works would continue to work. This is under the assumption the world around it is not changing. The bad news is everything that does not work will never work.
With a big company that has a lot invested in their current processes, they want to be sure a change is going to be worth it in the end. There will have to be manpower invested to convert current processes. Resources will have to be pulled away from the current system to research new possibilities. Big companies are big because people have come to rely on them. They do not want things to break because they do not want to break the trust their clients have in them. However, if they do not evolve, a smaller, more agile company will replace them. Because of this, such companies must continue to press forward. Keen discretion must be used to pick the right opportunities for moving forward.
Ultimately, it seems all sizes of companies are needed. Small companies to drive the industry forward. Big companies to keep the industry afloat. The companies which will excel are those which can balance these forces within themselves. By breaking organization down, the fluidity of a company can be increased, but it comes at the cost of efficiency. Efforts will undoubtedly be duplicated without proper management and oversight. Learning to share resources, and yet, at the same time, be independent will be key.
I decided to get back to using a proper environment for software development. What does this mean? Mostly, that I started using a fancy IDE and version control again. The advantages I get are extra features to make my development life easier and not having to worry about losing any code. Essentially, I put in some extra work up front to negate headaches down the road.
My IDE of choice is Eclipse. I went with the latest version to see how well it works. In the little bit I have used it so far, I am impressed with how far plugin installation has come since the last time I touched it. I used to keep my plugins in separate directories and link them into the application because it was the only way to keep any sort of order on installation, upgrades, and removal of the third-party software. I have used this improved functionality to install the PHP Development Tools plugin which is dependent on the Web Tools Platform. These two packages combined give me almost everything I need to do web development. I will likely add in some things for database design when one of my projects takes me that direction. The C/C++ Development Tooling plugin will almost certainly be added along with other language-based plugins over time. Some day I intend to look into some source code analyzers to discover potential security vulnerabilities in my code. The other plugin I have installed at this point is Subversive to integrate Eclipse with my version control system.
For version control, I installed Subversion (SVN) on Ellinore, my server which has a RAID 1 mirror. Not only does this make sure I have my code should a hard drive fail, but allows me to easily revert to previous versions when my radical idea to solve the world’s problems fails horribly. I have had problems integrating SVN and Eclipse before, but Subversive made it rather easy minus a complication due to licensing issues.
I am trying to separate the components of my projects as much as possible when defining SVN repositories. This will allow me to more easily integrate different versions of different components as they become ready. To accompany this focus, I dabbled with Ant some today. Ant is a build tool which makes it fairly simple to pull versions of software from various SVN repositories along with performing other necessary tasks to produce a working piece of software. I will likely be spending the rest of my night putting together a build file to allow me to recreate an entire website from a dozen SVN repositories and a couple scripts. When I get it working, I will only have to run a single command to completely rebuild a test website.
This post is intended to be a simple overview as well as an update on what I have been up to lately. If you would like more details into any particular area, let me know, and I will see what I can do.
First off, you should check out my Future Enhancements page if you have not already. As of right now, I am hoping I can knock off most of those things if not all of them by the end of the year. Of course, there will likely be new items on it by then so I doubt my work here will ever be done.
Another hobby eating up a lot of my time is how much I have been getting back into Call of Duty 4 on the Playstation 3. This entails a little more though than people might think. Considering I am an active member in a videogame clan, we have started to look at playing the game semi-competitively again rather than just dominating random people in regular games. This means I spend at least an hour dealing with administrative work for every match we play, but I think I will save the details for another post. Things, unfortunately, got a little rough this past weekend due to a hack released on the internet allowing opposing players to be able to fly as well as being invincible during that time; though, they cannot shoot. It was enough to put a damper on the game unless playing with a strong party capable of embarrassing these players.
In conjunction with all the game playing and competition overhead, I have started to dabble some with recording video from my play. I have around two to three hundred gigabytes of video sitting on hard drives from last summer. This used a rather bland recording rig so the quality is not very good. Nonetheless, I have finally started going through it in order to build some video editing competency. It will be posted on youtube for all to see once it is complete. Do not expect any quick turnarounds on it. However, before I could do the editing, I needed to find some good software. Sony Vegas exists, but it costs a lot of money unless you want to pirate it. Even then, it is primarily a Windows-based application unless time is spent finagling with it. I managed to come across kdenlive which is more than enough for my needs. I think so far I have only found one feature in Vegas that is not in kdenlive, and yet, I am easily able to workaround it. In addition to all of this, I bought a new bit of hardware back in April that allows me to get much better quality of video. Did I mention I am also able to use it from linux? My previous rig required me to boot Windows on a machine. I was not even able to get the old Hava to connect with a Windows vm. I probably could have if I had spent more time tinkering with the vm networking, but I never did. My Hauppauge took me about a day to get working on an Ubuntu server. I used a website and then posted on the Ubuntu forums for a bit of help. I had it working within an hour of coming home from work the next day.
I also got a new phone almost two weeks ago. If you feel you should have my number, email me and I send my number to you if I feel like you deserve it. My phone is an LG EnV3 on the Verizon network. Despite some interesting news about how insecure Verizon is, I decided to go with them since the other providers do not seem to be any better. The nice part about my new phone is I have unlimited text and picture messages, 3.0 megapixel camera, email and web with unlimited data, as well as a national plan. This means I am connected to the internet pretty much wherever I am. I have discovered though that my website crashes my phone’s browser. Needless to say, I will have to update the list of future enhancements to go mobile.
I went out golfing yesterday and shot fairly well overall. I actually shot amazing for four holes, mediocre for two holes, and terrible on three. The highlight of the day was by far my near eagle on hole six. I was sitting out roughly 130 yards from the pin in the next fairway. Distance was hard to judge because the markers were terrible and impossible to find. There was a tall tree directly between me and the pin. I figured if I hit a 7-iron, I could make it over the tree, but I would have to hit it strong to make the green. I went for it and absolutely crushed the ball, hitting it just over the top of the tree. The ball landed short of the green, bounced twice, and rolled into the pin before deflecting a couple feet away. I made the short putt for the second birdie of my life. I also put the ball on the green off the tee on both par 3′s and hit one of the prettiest drives of my life off the tee at hole 9. I still need to work a bit on avoiding water hazards and losing my ball into the brush. I could have dropped four strokes or more with that alone.
Those are the events of the past couple of weeks. I will be heading down to Kansas City for some fun this weekend before moving back to college the following weekend. I am looking forward to the week I have off between work and classes starting. Best part about this fall is I am only taking two classes, doing my undergraduate computer science research, and sitting in on another class. In other words, I will have a lot more free time than is normal for me. That being said, I am sure I will still be busy with personal projects and hanging out with friends.
So my sister has requested I write something other than technical blogs from time to time. This becomes a bit of a problem when I live, breathe, and eat code. It turns out if I buy the right kind of cereal, I can get some decent pseudocode going in the morning. Though, I will say it is difficult to find cereal with semi-colons and curly braces. For those wondering what I have been up to this summer, I currently have four websites on the table with negotiations still wrapping up for one of them. That does not count any of my personal projects such as this one. To make matters worse, I have come across the blogs of Jeremiah Grossman and RSnake, two elite web security specialists. The results of this has been me spending a portion of my time tonight reading some web security talks online as well as tinkering with Fierce and Nessus. Remember how I started this post by talking about how my sister wants me to talk a little less about geeky stuff? That does not mean I remembered it while writing this. Actually, I just meant this to be an update on what I have been up to lately and a lot of it is technology oriented. Call me a geek if you must.
What else have I done? A week ago I participated in my first United States Tennis Association tournament. I walked into the whole thing very tentatively. I have not played competitively since high school four years ago unless you count the poorly organized intramurals at college. I started to play semi-regularly last fall along with playing some this spring. However, I had not hit in a solid two months when I decided to register for the tournament. As a result, I chose the easiest skill level since I was not sure what I would be getting myself into, and I figured winning easily would be more fun than getting crushed. It turned out only one other person registered for my division and it was quite easy. I had gotten in a couple hours of hitting with an old friend on Wednesday. Still, I was hitting even better come the time of the tournament on Saturday. I managed to get a cool t-shirt, a nice plaque, and an instructor’s phone number to call about hitting sometime. All said, the tournament was pretty fun, and I am looking to go to another in Cedar Rapids this weekend. I will make sure to step up a skill level this time around.
This past weekend was a lot of fun. I drove up to Cedar Falls to spend some time with my girlfriend along with attend a wedding of a previous roommate further on down the road. Taking time to relax and watch movies with Jess was great and the wedding was a blast. We also got to watch some of The Open, Tour de France, and PBR on tv on Sunday. For those who dont know, The Open is the equivalent of the golf US Open but in Britain, Tour de France is bicycling, and PBR is Professional Bull Riding. To top the weekend off, we went out golfing on an amazing day. Needless to say, the weekend was over in no time, and I was back dabbling with computers in my apartment.
Tonight has been another moment of relaxation. I started with taking care of some apartment errands early on. Then I proceeded to dabbling in web security reading and tinkering. That was followed up with watching the Chicago Cubs look terrible again along with some light web development. In case you have not noticed, I have implemented a couple new themes and a theme changer to account for different reader preferences. Hopefully, I will continue to improve on this feature over time. I was able to catch up to July on Wallingford’s blog as well. Now I am finishing off the night with a little Sportscent on ESPN and writing this. With that said, good night!
Many of you have likely seen my “Why IE Sucks” page which I advertise to all my visitors using an Internet Explorer browser. I got a comment in response to it asking what I thought about IE8. I was going to reply directly to the comment, but then what I had to say turned out to be much longer than I thought it would be. Thus, I decided to create a new post for everyone to read. Here it is.
I admit I have been really behind in my IE8 experiences. In some ways I am happy because this proves just how distant from Microsoft I am truly becoming. In other ways, it is kind of disappointing because it is hard to make a quality bash on a product unless I am at least somewhat familiar with it. I think I just updated to IE8 on a Windows XP VM last night. I have not used it yet, however. Though from the brief dabbling from Net Renderer I have done, IE8 is not too bad. From what I have seen, it even renders this site correctly which is more than any previous version of IE can say. I do find it funny there is a compatibility mode to try to prevent the “catastrophe” that was the upgrade from IE6 to IE7. It will not be overly useful going forward, but it helps manage the first year or so while developers make the transition to a standards-oriented version. Overall, it seems to hold its own with Firefox 3.0, but still is slightly behind Firefox 3.5 which just released a couple of weeks ago.
From what I have read online, IE8 passes the ACID2 test, but does terrible on the ACID3 test. As much as this pains me, I have to give Microsoft props for making the effort to fall in line with some of the most popular standards. I would not say they have the best browser out there, but they did considerably narrow the gap as far as web standards are concerned. I cannot speak on the usability, but at least IE7 made huge gains there too with things like tabbed-browsing. If they keep following this path, I will have a hard time continuing to laugh at Internet Explorer. Do not expect this to make me a Microsoft fanboy or even start using their products anytime soon, but maybe I will hate them just a little less. There will be more to come on Microsoft and its plans for the future in the near future.
P.S. Yes, that is right. I did just use future twice in the same sentence!