Filed Under: programming with 0 Comments
We use similes and metaphors quite frequently, particularly in software. Everything is so figurative and you spend all day coming up with names for things that are “like” real world objects. Of course, that’s not counting those things which are not like anything else other than what they are in software. This is not about them. And this figurative language we carry over into customer engagements too, explaining to our dear customer why the original quote does not hold since they subsequently added the kitchen sink and “tinted windows”
Not to mention explaining why that takes an extra ‘x’ weeks.
During one such session, it suddenly dawned on me halfway through the metaphor, that the client started extending the metaphor and the proceeded to re-apply it back to the software project, taking it too literally, and ended up explaining to me how software works based on the metaphor at hand. Doh! And all i was trying to do was help educate and understand…
I think IT, in general, has come under heavy pressure to talk the language of the client- and indeed, we are encouraged to keep getting better at this. Make it more accessible so that they understand… Why?
I don’t understand that thing my dentist uses to fill a tooth; nor do i care about the gadget the plumber used to seal the pipes with; and yay for the structural engineer who … well, i really don’t know what he did. But i still use and pay for their services. Did they go to great lengths to explain the intricacies of their tasks? Nope. Did it matter. Not really. I engaged them- they told me how much and how long- i paid, they did it. Moving right along.
I think the more we “passively force” non-programmers to understand what we’re doing, the more confusion we sow. Particularly when the metaphor we use is so accessible, we have no idea how their experiences, assumptions and understandings will impact on the point we’re trying to convey.
As programmers, we owe it to ourselves to forge the language (jargon) we have created, not with the purposes of creating a divide, but so that we can just get on with the job, efficiently. Without the extra fluff. Of course, that’s not to say don’t make an effort to help a client understand, if they want to understand on technical terms. Dumbing it down doesn’t really help, except maybe in polite social discussions ![]()
Filed Under: programming with 0 Comments
You may have heard it before, and if you haven’t, you need to understand that. Besides all the technology and implementation caveats, competing frameworks and myriad and variety of business rules within the same vertical, there’s also the challenge of finding competent resources.
Coding is the easy part. Almost anyone can do it, given enough time with a “Learn _INSERT_LANGUAGE_ in 24Hrs” and a off-the-shelf PC. Even better, do a condensed one year course and come out the other side “qualified” and even better, command a “qualified” salary. What ludicrosity!
Now that’s not to say one year condensed courses and self-taught programmers are to be frowned upon. Some of the better programmers i have worked are self-taught. What you’re not, as a self-taught, or one year crash course graduate, is qualified. Far from it. And then even 4 years into your career, and some candidates reckon they’ve seen it all: they’re intermediate, looking for a senior post (along with the salary). Inconceivable.
Yet, this is what seems to be the status quo in South Africa right now (or at least, that is, in Cape Town). There is a massive demand for C# programmers (in particular) and the demand has outstripped the supply so greatly that the market is flowing with inexperienced skills demanding (and sometimes getting) the outrageous salary demands they’re placing. And the only reason they’re getting it, imho, is that whoever’s hiring them a) are not concerned with quality b) haven’t a clue what they’re doing or c) are really doing so well financially they can afford the risk. And maybe have a secret to mitigating that i don’t know about…
Of course the greater danger is the software that is out there. And then the pervading negative experience in bespoke software that continues because a bunch of “senior” programmers couldn’t get it right.. Go figure.
Two prominent cases recently gave the issue some visibility. The traffic registration system and the online tax filing systems. The traffic department came to a grinding halt for literally weeks because of concurrency issues on the system. The online tax filing handled well enough during the pilot, but when it was opened to the public, it hung. Badly. And we’re not talking about millions of hits per day either…
Until you’ve got about 7yrs of pure development experience (as a guideline, not a dogmatic rule) i don’t think you’re qualified enough to even contemplate leading anything. Stick around for a bit, get some more diverse experience and when you start approaching 10 years in the trenches, maybe then consider grooming yourself in preparation for more of a leadership role. Until then, you’re ultimately only bluffing yourself. Of course, it doesn’t help that the market regards a one-month MCSD as a competent programmer. It just makes it easier to sidestep your own professional integrity.
Please note, the actual number of years is a guideline and, as with everything, there is a lot more to consider than just historical “age”.
Filed Under: programming with 6 Comments
A good working environment is essential to ensure productivity in any project, even more so in an agile environment where the pace can often be quite steady, without reaching burnout. A couple of tips…
1. A spacious desk. You can’t have too much clutter or you will get distracted.
2. A gym ball instead of a chair. I’ve used one for many years now and much prefer it. It also helps avoid the programmer’s hunch.
3. Dual monitors. A luxury, i must confess, i’m still trying to get used to.
4. Stationery! No desk would be complete without much needed pens, markers and post-it notes but an arm’s stretch away.
5. Trash can. Not the virtual kind, but the real kind. Those post-it (and outdated technical specs) notes need to go somewhere, eventually.
6. And last but not least, the PC. Tucked away and out the way.
And that’s it. Oh, and one word of warning. If you ever have the urge to sneak hand-cream onto the ear piece of any of your colleagues’ phones… embrace the revenge
Guys, you know who you are… outstanding job! Seriously. This is going to be a hard act to follow, but i relish the scheming ![]()
Filed Under: programming with 0 Comments
It’s subtle, and easily overlooked.
Server side calls in the domain layer are setting all sorts of properties on an object before pushing it over to the database for persistence. The database receives the object, persists and returns. The domain then requests an updated snapshot from the database (which may or may not include the data recently persisted). Nothing tricky, stock standard code.
Domain::Foo::DeactivateContact(DateTime.Now);
Domain::Foo::SelectDeactivatedContacts();
Problem creeps in when the server side code (domain) resides on a different server to the database and both servers are dealing with DateTime as a parameter for filtering on datasets. If their timestamps are not synchronized, down to the millisecond, you’re likely to get an inconsitently reproducible bug. As was the case recently…
A ‘contact’ was deactivated by setting the deactivatedTime field with a value on the domain server.
Deactivated contacts were returned by the data server based on the data server’s getdate() value.
When the two calls are sufficiently close to one another, your newly deactivated record sometimes appears in the second result set, depending on whether the two calls are within the same second according to the various timestamps on the different servers. Huh? ![]()
“Esoteric”, as Eugene used to say.
And you can’t overcome the issue 100% of the time reliably. Not when you start partitioning, synchronizing, servicing and load-balancing logic within a virtual network. You can however, be aware of the problem and plan accordingly. It’s just one of those (depending on the kind of systems you’re writing) you just keep in the back of your head until it surfaces one day… ![]()
Filed Under: programming, technology with 0 Comments
So part of the whole Ubuntu move has also involved migrating my predominantly MS-based programming skillset into something *else*. As it is, i am studying part-time to complete a B.Sc Applied Mathematics, so this year will be a little slower at times on the technology front, but it proceeds, nonetheless.
So far, i’ve managed to learn a little Python and PHP. Turbogears, Django, CakePHP and Zend all occupy my headspace at the moment. The one thing they (the frameworks) have in common though is MVC, so once you have that covered, getting to grips with the semantics of each framework is a little easier.
In the process though, i’ve ended up learning a lot about my Ubuntu installations (server and desktop), managing Apache2, user rights and managing those on the system, network interfaces, MySql and Sqlite, a lot of “notepad” editing (ala nano, vi and gedit)… actually, come to think of it, i’ve learned more about *nix this year than Windows and i’ve had a whole lot more fun too ![]()
Of course, i could have spent the time learning Linq, WPF, WCS, etc.. etc… but you can tell from my enthusiasm, i’ve been getting a little jaded with all the MS hype that just turns out to be the same ol’, only with more hoops. To be fair though, i did enjoy some of the .NET porting to Mono.
And that’s been the difference: the fun factor. Learning is fun. When it’s not fun, it’s not learning. It’s cramping.
Filed Under: .net with 0 Comments
Exception handling is important enough to get right. And there’s plenty of sample code out there to help you get it right, nonetheless, i come across two major variations:
catch (Exception ex) {
throw;
}
and
catch (Exception ex) {
throw ex;
}
There’s more about catching general Exception but that’s beyond the scope of this post. So, moving right along…
There is one other variation:
catch (Exception ex) {
throw new Exception(ex);
}
But the first two are more interesting. The second (throw ex;) is the least desirable, unless of course you have a good reason to not preserve the stacktrace.
Code attached rethrow.txt
Filed Under: technology with 0 Comments
I was trying to access the MS Partner website… but with Firefox. They didn’t seem to like that very much
Filed Under: technology with 0 Comments
There, i said it. And i’ll say it again. I hate spam.
Akismet is a real lifesaver, and along with SpamAssassin as well as Mozilla Thunderbird and i live in a state of “managed” spam. The odd irritation gets through, but nothing like before…
Between viruses, worms and spyware the computer desktop is enough of a nightmare and then you got to deal with spambots everywhere! Seriously… it’s outta hand.
It’s ridiculous to the point that you get initiatives which have to spend their time and effort combating something which nobody even wants?! methinks a good time to throw what time i have saved from spam filters and put it into
![]()
Filed Under: .net with 2 Comments
Whiskey Tango Foxtrot, but this was super unpleasant to uncover.
I’ve got a website up ‘n running and wanted to add a webservice to it, aight? Wizards make the job easy so here i go:
“Add > New item > Asp.Net > Web Service > Ok” Programming has never been so easy…
Navigate to webservice and … *poof!*
Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.
Line 1333:
Line 1334: OperationBinding FindHttpBinding(string verb) {
Line 1335: foreach (ServiceDescription description in serviceDescriptions) {
Line 1336: foreach (Binding binding in description.Bindings) {
Line 1337: HttpBinding httpBinding = (HttpBinding)binding.Extensions.Find(typeof(HttpBinding));
[NullReferenceException: Object reference not set to an instance of an object.]
ASP.defaultwsdlhelpgenerator_aspx.FindHttpBinding(String verb) in
c:WINDOWSMicrosoft.NETFrameworkv2.0.50727CONFIGDefaultWsdlHelpGenerator.aspx:1335
Dang wizards! Obviously badly generated code? Not so…
All the performance hints and profilers will tell you, if you don’t need to automatically wire up your events, set the AutoEventWireUp=false (no, i’m not going on a blatant tangent here) in your .config. What they don’t tell you is that the @Page directive influences the generation of Wdsl for your webservice. Obviously. :S
http://www.dotnet247.com/247reference/msgs/35/177335.aspx
http://forums.asp.net/p/385662/385662.aspx#385662
http://support.microsoft.com/default.aspx?scid=kb;en-us;324151
And in the immortal words of John Lennon: “I’m not the only one” (who got duped).
MS, you’re gonna have to do better than that if you want to catch us out
Filed Under: maths, ubuntu with 0 Comments
A couple of things to be aware of if you’re doing this installation, which i discovered through trial and error
The machine id used for activation is based on the MAC address of eth0. On my machine, for example, my active interface is primarily the wireless card which is set as eth1. Hence, no machine id available for activation. How to fix?
bryan@noah:~$ cat /etc/iftab
# This file assigns persistent names to network interfaces.
# See iftab(5) for syntax.
eth1 mac 00:00:00:00:00:00 arp 1
eth0 mac 11:11:11:11:11:11 arp 1
where 00:00… and 11:11… represent your actual MAC addresses obtained by ifconfig.
My wireless card was eth1, so i simply switched this around so that my wireless is now eth0, rebooted and i now have a machine id with which to activate MATLAB.
Second issue was an error to the tune of: “version GLIBC_2.0 not defined in file libc.so.6″ when trying to use the Symbolic Toolkit, particularly. See the MathWorks Technical Solution for more information on this error. The steps they outline there didn’t work for me (it is for Red Hat afterall), but what did work was copying the libmaple.so (provided by MathWorks) into your matlab/glnx/bin directory. See discussion here (in German).
Success. Incidentally, i’m using MATLAB because my university wants me to use it, but otherwise if you need something equivalent in the OSS sphere, try Octave. ![]()
The time has come, the Walrus said… Not moving very far, but consolidating the technology and personal ranting all into one uber blog. New location (location, location, location) is http://bryanallott.net/blog/. Updated feed URL (http://feeds.feedburner.com/bryanallottnet)
I say “industry” but there’s no real regulation put in by the government (at least here) which keeps the industry in check. For one, it’s not illegal to provide IT services or build software without a licence, while in more established industries, it is illegal to, for example, provide medical, financial, engineering or manufacturing services […]