Archive
That’s All It Takes?
The MITRE corporation has a terrific web site loaded with information on the topic of system engineering. In spite of this, on the “Evolution of Systems Engineering” page, the conditions for system engineering success are laid out as:
- The system requirements are relatively well-established.
- Technologies are mature.
- There is a single or relatively homogeneous user community for whom the system is being developed.
- A single individual has management and funding authority over the program.
- A strong government program office capable of a peer relationship with the contractor.
- Effective architecting, including problem definition, evaluation of alternative solutions, and analysis of execution feasibility.
- Careful attention to program management and systems engineering foundational elements.
- Selection of an experienced, capable contractor.
- Effective performance-based contracting.
That’s it? That’s all it takes? Piece of cake. Uh, I think I’ll ship some parkas and igloo blueprints to hell to help those lost souls adapt to their new environment.
Psychopaths And Bozeltines
As I sat down to write my next post, I was staring at the blank page when this quote came to mind:
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. – Damian Conway
D’oh!
I really do try to take Damian’s message to heart. How about you? Do you buy into it? Do you buy into this instead:
Always code as if the maintainers of your code will be bozeltines who won’t have a freakin’ clue about what it does, how it works, or how to modify it – and so that they’ll be in awe of how much smarter you are than them.
Benevolent Dictators And Unapologetic Aristocrats
The Editor in Chief of Dr. Dobb’s Journal, Andrew Binstock, laments about the “committee-ization” of programming languages like C, C++, and Java in “In Praise of Benevolent Language Dictators“:
Where the vision (of the language) is maintained by a single individual, quality thrives. Where committees determine features, quality declines inexorably: Each new release saps vitality from the language even as it appears to remedy past faults or provide new, awaited capabilities.
I think Andrew’s premise applies not only to languages, but it also applies to software designs, architectures, and even organizations of people. These constructs are all “systems” of dynamically interacting elements wired together in order to realize some purpose – not just bags of independent parts. As an example, Fred Brooks, in his classic book, “The Mythical Man-Month“, states:
To achieve conceptual integrity, a design must proceed from one mind or a small group of agreeing minds.
If a system is to have conceptual integrity, someone must control the concepts. That is an aristocracy that needs no apology.
The greater the number of people involved in a concerted effort, the lower the coherency within, and the lower the consistency across, the results. That is, unless a benevolent dictator or unapologetic aristocrat is involved AND he/she is allowed to do what he/she decides must be done to ensure that conceptual integrity is preserved for the long haul.
Of course, because of the relentless increase in entropy guaranteed by the second law of thermodynamics, all conceptually integrated “closed systems” eventually morph into a disordered and random mess of unrelated parts. It’s just a matter of when, but if an unapologetic aristocrat who is keeping the conceptual integrity of a system intact leaves or is handcuffed by clueless dolts who have power over him/her, the system’s ultimate demise is greatly accelerated.
The Parallel Patterns Library
Kate Gregory doesn’t work for Microsoft, but she’s a certified MVP for C++. In her talk at Tech Ed North America, “Modern Native C++ Development for Maximum Productivity”, she introduced the Parallel Patterns Library (PPL) and the concurrency runtime provided in Microsoft Visual C++ 2010.
The graphic below shows how a C++ developer interfaces with the concurrency runtime via the facilities provided in the PPL. Casting aside the fact that the stack only runs on Windows platforms, it’s the best of both worlds – parallelism and concurrency.
Note that although they are provided via the “synchronization types” facilities in the PPL, writing multi-threaded programs doesn’t require programmers to use error-prone locks. The messaging primitives (for inter-process communication) and concurrent collections (for intra-process communication) provide easy-to-use abstractions over sockets and locks programming. The messy, high-maintenance details are buried out of programmer sight inside the concurrency runtime.
I don’t develop for Microsoft platforms, but if I did, it would be cool to use the PPL. It would be nice if the PPL + runtime stack was platform independent. But the way Microsoft does business, I don’t think we’ll ever see linux or RTOS versions of the stack. Bummer.
A Costly Mistake For Many
In “Learning Standard C++ as a New Language“, Bjarne Stroustrup gives a slightly different take on the waterfall method of software-intensive system development:
“… treating programming as merely the handmaiden of analysis and design doesn’t work either. The approach of postponing actual discussion of code until every high-level and engineering topic has been thoroughly presented has been a costly mistake for many. That approach drives people away from programming and leads many to seriously underestimate the intellectual challenge in the creation of production-quality code.“
If your company implicitly treats software engineers like “code monkeys” and great engineers strive to “rise” into coveted management positions ASAP because the unspoken ethos is that “coders” are interchangeable cogs, then your company most likely has made costly mistakes in the past and it will most likely do so again in the future.
Popularity Contest
The TIOBE Programming Community index is an indicator of the popularity of programming languages. The index is updated once a month. The ratings are based on estimates of the number of skilled engineers world-wide, available training courses, and third party vendors. The results are computed (somehow) from the web’s most popular search engines; Google, Bing, Yahoo!, Wikipedia, YouTube, and Baidu.
My favorite language, C++, is in third place, but quite a bit behind Java and C. I think that Objective-C took a big jump relative to last year because of the Apple iPad juggernaut. I’m bummed that my second favorite language, Erlang, didn’t even make the top 20.
Direct Experience Is Not Enough
I read a lot of books and articles in topic areas that, for some divine reason that I don’t know, interest me. I do it because personal growth and development through doing and interacting with others in a local environment, even though it instills deep understanding and nurtures social bonding, is just too glacially slow for me.
The next best thing to learning via direct experience is to expose oneself to the work and personal experiences of others through reading what they wrote. Even though I’ve never met them, I think of my favorite technical authors as a group of highly competent consultants readily available at my beckon call. How about you? What techniques and practices do you employ to keep on growing and developing?
Personal And Social
Another Rare Gem
At Saab Sensis, we use Atlassian‘s Confluence wiki and Jira issue tracking tools for intra-project communications. They are wonderful, easy to use, and instantaneously fluid communication tools that increase productivity relative to the sole use of paper documents and fragmented, agenda-less meetings.
After reading this article by Atlassian employee John Rotenstein, “It’s the Culture, Stupid!“, I’ve added the company to my list of faves:
So, how did Atlassian squeeze into the esteemed BD00 list of faves? Here are the snippets that did the trick:
- Atlassian’s CEOs have instilled an information culture throughout the company with the core value of “Open Company, No Bullshit”. The result is a bottom-up democracy of information where information sharing is the norm and information hoarding is a foreign concept.
- The very act of using a wiki, with its easy access to information and default ‘open’ nature of information, led to an information culture in Atlassian of openness and sharing.
- Where ever possible, information is made accessible to all staff. Instead of sending person-to-person emails, relevant information is placed on the wiki for all staff to read. Instead of storing information in documents (eg Word files), information is entered directly onto the wiki so that it is searchable and accessible to all staff — even from home! New staff members, upon joining the company, have immediate access to all historical information kept on the wiki.
- From the very beginning, Atlassian founders Mike Cannon-Brookes and Scott Farquhar had a firm belief in having an ‘Open Company’. Unlike other companies that kept information in silos, their vision has always been of a company that has open information by default.
Regarding number 1, I love when employees and executives use everyday language within and without the company – not the carefully crafted, robo-management jargon that wall-streeters and elitist big-wigs want to hear.
Regarding number 4, I love how the company policy toward information is open by default; not closed by default like the moo-herd.
Note: With a tinge of regret, I replaced Saab Sensis with Atlassian in my list of faves. It’s a good company and I really do like working there, but after a bit of reflection and re-evaluation, it’s just not in the same class. In BD00’s whacky and weird world (where you don’t wanna go because the sky is pink and water flows uphill), Saab Sensis is a notch above the sea of CLORGs and DYSCOs that dot the landscape, but a notch below these world class organizations.
State Of The Union
For the multi-threaded CSCI that I’m developing, I’ve got to receive and decode serialized messages off of “the wire” that conform to the design below. Depending on the value of “payloadType” in the message, each instance of the “WireMessage” class will have either an instance of “DataBlock1” or “DataBlock2” embedded within it.
After contemplating how to implement the deserialized replica of the message within my code, I decided to use a union to keep the message at a fixed size as it is manipulated and propagated forward through the non-polymorphic queues that connect the threads together in the CSCI.
The figure below shows side by side code snippets of the use of a union within a class. The code on the left compiled fine, but the compiler barfed on the code on the right with a “data member with constructor not allowed in union” error. WTF?
At first, I didn’t understand why the compiler didn’t like the code on the right. But after doing a little research, it made sense.
Unlike the code on the left, which has empty compiler-generated ctor, dtor, and copy operations, the DataBlock1 class on the right has a user-declared ctor – which trips up the compiler even though it is empty. When an object of FixedMessage type is created or destroyed, the compiler wouldn’t know which union member constructor or destructor to execute for the two class members in the union (built-in types like “int” don’t have ctors/dtors). D’oh!
Note: After I wrote this post, I found this better explanation on Bjarne Stroustrup’s C++0x FAQ page:
But of course, the restrictions on which user-defined types may be included in a union will be relaxed a bit in C++11. The details are in the link provided above.












