Where are there real problems to solve?

“Aren’t There Real Problems To Solve?” 

I have always spent a lot of my time in small or midsize companies (10 to 200 employees), and I can assure you the answer is ABSOLUTELY. 

These are hard working people who are in a different world than most of us. They don’t facebook, twitter, or IM at work. But they are unbelieveably busy trying to get things done while depending upon software and systems that most of us here would laugh at. 

Many of them don’t have time to get to all their emails and voice mails. They have to make snap decisions all day long without enough information because their software just doesn’t give them what they need easily enough. They have constant problems with interpersonal communication, instruction, and understanding. 

Just a sample of what I’ve witnessed in the past 3 weeks: 

- We need multiple “ship to” addresses for this institutional customer. The software doesn’t support it. 

- The exchange server is down. 

- We need multiple prices for the same item, depending on the scenario. The shopping cart won’t allow it. 

- 300 “smart part numbers” were configured incorrectly because no one gave Jane the correct Vendor Codes last week. But now, we have orders, inventory, and history for those items, so the software won’t let us change or delete them. 

- The exchange server is down. 

- No one remembered to reset the warehouse server last night, so everything came in today with the wrong date. 

- The new stockroom printer doesn’t support HP PCL, so the bar code labels are all wrong. 

- We think that $90,000 order acknowledgement from XYZ Company was deleted by the spam filter, but we’re not sure. 

- There was a bad pointer in the UPS data base last Tuesday, so 72 packages all went to the same customer in Duluth. 

- The wrong 800 number is being printed on our invoices. Our customers are calling a sex hotline. 

- The exchange server is down. 

These are not jokes. I see them all the time. And while we regale all the cool stuff WE are doing, I can honestly say that the situation in many small businesses hasn’t improved all that much. And there are 7 million of them. They need help. 

The good news? This is a fantastic opportunity for those with our skills and technology. 

Yes, there are plenty of real problems to solve. Stay tuned. 

How are we making this too complicated?

I have had people come to me with seemingly complex problems requiring what they thought would be complex solutions. Oddly, the elegant solution was often a gross simplification of the complex problem. Often because I just didn’t understand the complexity. 

Example 1. A shipper can only fit 1200 boxes in a 40 foot trailer. The material is so light, they can never make weight. The boxes must be delivered to depots throughout the United States with no more than a 3 day window either way. What box should go on which truck? The customer thought they needed sophisticated algorithms to provide an optimal solution. The simple solution: a screen where an educated user can drag boxes (or groups of boxes) to trailers and can drag trailers to destinations. The computer did very little, but the difficult business problem turned into a “game” that employees fought each other to “play”. 

Example 2: A cloth manufacturer wanted a linear algebra solution to determine what products to mount on their mills and where to set the knives. The simple solution: A screen with all customer orders and key data about each order (size, weight, width). Everything on the screen was sortable and switchable. Again, an intelligent user could “play a game” to schedule the mills almost as well as any automated algorithm. 

Example 3: A distributor wanted to know what to buy, when to buy it, and what to put on sale to move slow inventory. He wanted an expensive ERP program. The simple solution: A screen with all supplies and demands that can be mixed, matched, sorted, and selected in many different ways. Again, an intelligent user can “play” with his data and then confidently make decisions. 

The “real” bonus of all these “simple” solutions? The person drove the decision and felt in control of the situation. No more blaming the computer for the results. 

My suggestion: Slow down. Even stop. Ask, “How are we making this too complicated? What simple little thing could I do to get just part of the way there?” You may surprise yourself and find that the simple little idea IS the solution. 

How do you test drive packaged software?

I just converted a client OFF of a major enterprise package to something 20 years OLDER and much easier to use. Frankly, I was stunned to see how difficult it was to use and how poorly it was designed. 

Examples: Even though it maintains 160 columns for each Order Header, “Time Entered” is not one of them. So go ahead and try to schedule a call center with no Time Of Day history. To review a single customer’s history (and presumably answer their questions while they’re on the phone), you have to open up 6 different windows! 

My general suggestion: Write a “Test Drive” based explicitly upon your client’s business. Have them enter an order and take it through every stage of it’s life (reserve or commit inventory, print, pick, ship, confirm, bill, collect, post, etc.) The test drive should also hit every function needed to do this, setup a customer, SKU, GL Chart of Accounts, etc. Then have the appropriate person working for your client do their job on that system.

DO NOT touch the mouse or keyboard. DO NOT let the vendor touch the mouse or keyboard. 

If they can’t enter, ship, and bill an order in a couple of hours with less than one day’s instruction, eliminate the system and save yourself a lot of expense and headaches down the road. 

Naturally, most sales people will object to this approach and use any tactic to avoid it. Make it clear to them and your client that this must be the plan. The test drive method is infinitely more effective than the old RFP approach. When the poor systems are clearly failing the test drive, the saleman may object with questions like, “Are you going to train your people or not?” which you’ll calmly answer, “Not if it takes until 2018.” Good luck. 

How do you pick the best language for you?

I guess this is why I never post in language threads, we can go on and on all day. No one is right or wrong.
Anyway, I’ll try to address your comments.

There are so many different versions of BASIC; it’s possible we are visualizing very different versions. I am accustomed to using INFOBASIC dialects as in JBase or IBM’S U2 line. Everything numeric is represented as strings (integers) including dates, times, and decimals, so there is no “typing”.

As for efficiency, I used to benchmark like crazy, looking for the slickest algorithms and the best implementations of compilers and I/O routines. Not any more. Hardware has gotten so fast that I am more concerned with human time, not machine time. (Naturally, anything that runs 8 million times per second BETTER be fast.)

These days, I generate most of my code, so the verbosity of COBOL (if I used it) shouldn’t be an issue. But it is. I have to drop down to the source so often and I work on the code of others often enough, that I am most concerned with getting the whole job done with the LEAST code. This is where “juniors” fall down the fastest (IMO); there’s too many places for things to go wrong.

I know what you’re thinking, if this is the case, why not learn even more advanced languages and frameworks with even less code. I dunno.

I guess I’ve “settled into” what works best for me (as everyone should). Is it the best? Probably not. Am I open to better ways? Probably. But not today. Too busy.

Why are languages so unimportant?

I am proficient in about a dozen languages, but only use 3. I go back to the SPS, PL1, Fortran, and COBOL days, and would rather chew razor blades than ever use them again. Today, I use javascript on the client and php on the server; I have yet to find a problem I couldn’t solve with them.

In the years in between I discovered BASIC and have found it to be the Swiss army knife of apps. Not the old Dartmouth Basic, and certainly not anything Microsoft bastardized, but there are many other versions that seamlessly integrate with relational data bases that I think are a dream.

It’s actually reached the point where I “think” in BASIC, design my app, and then sometimes write in in javascript or php.

I certainly wouldn’t recommend my approach to someone else, but I think that’s the whole point. Use the right tool for the job and get good at it. I see no need to learn new languages just for the purpose of learning something new. If I get “curious” or want to expand my mind, I can think of several hundred app problems waiting to be solved in any language, take your pick.

Should I still be a programmer?

“I lack the fundamentals of Computer Science, the things every programmer should know: Algo’s, Data Structures, Operating Systems an understanding of compilers and being profficient with linux.”
Relax. That’s true for 99% of all programmers.

“Eventually I plan on going back to a real University and getting a CS degree”

Absolutely not necessary. You will probably learn more building anything than learning it in school.

“I’m starting to think I may have a learning dissability”

Maybe you do, maybe you don’t. Just because the rest of the world is quick to diagnose everything doesn’t mean you have to.

“I have come to accept that I’m really not smart. I’m slow, forgetful, concepts never seem to stick”

Your performance shortcomings could be for many reasons. Being “really not smart” is the least likely of any of them. They are much more likely caused by other things like uninteresting work, poor environment, personal issues, nasty people, or even health issues. Whether you’re “smart” or not, thinking that your aren’t is pretty much a guarantee for failure. Please don’t do that.

“I have started going through the basic Algo’s and Data structures again with a basic Java book about algorithms”
Sorry to say, but you’re doing it the hardest way you can. You don’t need a book; you need a project. I have achieved much, but have always had difficulty learning from books and theory. It’s hard! You need to find work where the things you need to learn will be required. Funny how quickly and easily you’ll find a way to learn them when you actually need them. I’m not sure how you should go about finding such work, but I know you’ll figure that out.

“I just don’t want to be a cargo cult programmer anymore.”

Good. That makes you normal.

“And finally trying to memorise all those linux commands I ALWAYS forget.”
Then use less commands. I have never used more that 10% of what was available in “any” technology and I always got the job done.
“I have to force myself”

This is the most important thing you have said. Have you ever actually enjoyed building stuff? Have you ever gotten really jazzed about the project you were working on? Have you ever lept up out of your seat and danced when you got something working?

If you answered “yes” to any of these questions, then you really do have the passion to be a programmer. Stop selling yourself short.
If you answered “yes” to none of these questions, then there’s no sense for you to continue wasting your time searching for the passion. If you haven’t experienced any by now, then you probably never will. No one should have to “force themself” to love what they’re doing. Find something else.

What are your hardest learned lessons?

A few of my hard earned lessons: 

Time spent working does NOT necessarily = amount of work completed. It’s easy to get discouraged when you “sense” you’re not spending enough time on something. Two days ago, for example, I didn’t work much. But it was a very productive day! By the end of the day, I figured something out and the flood gates opened. That’s just how it works for hackers sometimes. If you don’t care anymore, that’s one thing. But being frustrated about time spent is a signal something else is wrong, not your commitment. 

Some experts think we are either preprogrammed with “moving toward” or “moving away” internal metaprograms. OK, whatever. I’m a very positive optimistic person, so I just assumed I was a “moving toward” person. Wrong! I am HIGHLY motivated by that which I do not like, but I never realized it. If I see something I like, I think, “that’s cool”. But if I see something I don’t like, I think, “That sucks. I can do way better than that.” So I do. It may be one of the 7 deadly sins, but jealousy is a great motivator for “moving away” people. I’m older than every speaker at Startup Weekend, the Chief Justice of the Supreme Court, and our president. But I’m just as smart as any of them, and I haven’t got mine yet. That just pisses me off! (See, it works, I’m ready to hack right now.) What about you? How are you programmed? What can you do to stoke yourself (or piss yourself off)? 

“When do you know its time to call it quits?” Never. I realize most people will disagree with me. Walt Disney and Colonel Saunders went to a thousand banks before getting a loan. How soon would you have given up? When do you quit trying to teach you child how to walk because it’s not going as well as you’d like? Jerry Seinfield jokes that it took him 20 years to become an overnight success. I’ve seen the same thing with many hackers I know. If you know deep down inside that your project is a winner, you must do whatever it takes to get it to “walk”. If you’re not sure, then maybe you shouldn’t have started it in the first place. Only you can answer that one. 

What drives development?

I guess I’m a little bit different than others. 

I am TOTALLY guided by my customers. I wasn’t always this way. I used to think that something would be so cool, so I would build it, and often, the project went nowhere. I was fortunate to have a co-founder at one time who insisted that we sell it first, then develop it. I never completely came around to his way of thinking, but now I understand where he was coming from. 

My customers have never steered me wrong. They don’t waste my time. They only spend energy describing things that they really need, and invariably, others need the same things. 

The downside is that I never spend time working on my own pet projects. I KNOW I can build a better bridge game, fitness program, or home inventory program. I’d also love to blog. But all those things fall into the category of “No one else asked for it”, so I simply don’t spend time on them. Maybe some other time. 

Why do you program?

I’m not in it for the money. The money is a barometer of something else. If someone can make money in this business (not that hard to do), then something they wrote is successful at some level. 

I can confidently say that 90% of the code I have ever had to maintain is total garbage. I am often stunned that it even runs and I used to wonder how it ever made it into production. (I don’t wonder any more, now I know, hardly anyone QA’s source code anymore.) 

(Another example: Today I refactored 1200 lines of code that edits credit card numbers down to 46 lines, removing 4 bugs in the process. This has been running in production for 18 years. This is not a joke.) 

I realize that what I see is not a random sample of all code. I never get to work on the good stuff; no one does - that’s the whole point. 

My work, on the other hand, has been wildly received by my customers and users for many years. I love what I do and love providing value to others. I can’t imagine doing anything else. 

For some reason (my internal metaprogams or something), I am much more highly motivated by seeing someone else’s garbage doing well and thinking, “I can do WAY better than that,” instead of people saying, “That was good.” I don’t know why.

Also, it’s my experience that most people do not see the possibilities for truly excellent software (present readers excluded, of course). They believe they have to put up with my previous example. I can’t wait to show them otherwise. 

Why are you writing your own software?

Because the guy who wrote this: 

if (MonthNbr == 1) {MonthDesc = “January”} ; 

if (MonthNbr == 2) {MonthDesc = “February”} ; 

if (MonthNbr == 3) {MonthDesc = “March”} ; 

if (MonthNbr == 4) {MonthDesc = “April”} ; 

if (MonthNbr == 5) {MonthDesc = “May”} ; 

if (MonthNbr == 6) {MonthDesc = “June”} ; 

if (MonthNbr == 7) {MonthDesc = “July”} ; 

if (MonthNbr == 8) {MonthDesc = “August”} ; 

if (MonthNbr == 9) {MonthDesc = “September”} ; 

if (MonthNbr == 10) {MonthDesc = “October”} ; 

if (MonthNbr == 11) {MonthDesc = “November”} ; 

if (MonthNbr == 12) {MonthDesc = “December”} ; 

is a retired millionaire while I’m still cleaning up his mess. 

I think I can do better.