The sometimes abusive voice of the abused

We love to imagine we live in a world where those who have felt the pain of abuse more keenly understand the importance of kindness and the pain of its absence.  Unfortunately this isn’t always so, and abused populations are subject to the human flaw that the abused often become abusers themselves.  It’s striking how often people who identify as having been excluded use abusive tools when they become available to them.  Weather it’s direct physical violence, tools for social exclusion or other forms of marginalization, abuse is always wrong and it damages effort to create environments to overcome it.  As we try to develop a mature notion of progressive societies, our model of inclusion has to evolve to emphasis compassion and understanding over retribution or compensation through allowable aggression.

Encouraging New Golang Developers

I’m cross posting a reply I made on reddit today, encouraging a junior developer to learn Go, because I wanted to hold onto the reply.  I find this is a cyclic conversation with junior developers and we need to be better as a community in encouraging development at all levels (even for our senior IT folks), and particularly of under-represented populations in IT.

There’s no particular problem about being a junior PHP developer that would make learning Go difficult. Don’t try to learn Go as PHP, learn Go as Go and you’ll be fine.

It’s hard to tell what is going on in someones mind but when I see this kind of question asked by junior developers it’s often some version of questioning if they can handle the complexity or anxiety over percieved relative difficulties of languages. So through my career I’ve heard a lot of “I’m only a [Python|Ruby|php|perl] developer, I’ve always been intimidated by [Java|C++|C#|and now Go], do you think I can learn it”. IF this is the case than I strongly encourage you to learn it. There’s no magic to any language, it’s just time and some endurance to get unstuck when you do, and you will.

When people say software engineering is hard, I think it’s percieved incorrectly. It’s not that it’s complex (which it is), but that it’s very difficult to live with the pressure of that compexity over long periods of time. Nobody realizes everything they need to about Software Engineering all at once, it takes dedication and time. Go is no different.

So if any of that applies then all I can say is keep with it and don’t be daunted by your perception of Go. If you stay with it to get past some of the new conceptual models in comparison to PHP, I think you’ll find it surprisingly easy.

In your specific case I think Go will be a great language to learn in addition to PHP in that it will introduce you to more core language theory concepts. Also you’ll have a go to language for when PHP is too slow, or not an appropriate fit.

Anyway, best of luck and I hope you pursue it and find it a good experience

Why Sarah Sharp Leaving Linux Is Bad For Everyone

It was profoundly sad to read Sarah Sharp’s blog post today that she’s leaving the Linux Kernal development team.  The sort of it is that she just had it with the caustic social atmosphere maintained by that group, most famously exemplified in the well publicized rantings of Linus Torvald himself.

This to me is a universally bad sign for everyone not just in IT but everyone touched by it, which is everyone.

The chief damage of poorly socialize and highly aggressive communities in IT is that they develop a mono-culture.  They mistake a specific way of arguing and reasoning as the ultimate means of making progress in IT and thus limit the progress that can be made by those groups to those with that specific way of arguing and reasoning.

This closes what should be an open market place of ideas and limits progress in the field to people who can pass particularly personality tests or have their ideas recognized by people with a demonstrably limited ability to recognize or appreciate the worth of other human beings.

We have entered a phase of human history where conceptual models are the basis of or economy.  Cloud computing, iphones, kickstarter, service architectures, snapchat and most of the 1/3rd of the global economy driven by IT is entirely the product of conceptual models.  Communities like this ensure only a small number of socially compromised individuals will be able to bring their ideas to market, which limits the possibilities for all of us.

I understand this.  I passed a phase in my career where I had to step away from something I loved because the politics of it all left me burned out and I couldn’t see a way to recover.

I wish Mrs Sharp good fortune and happiness, selfishly I hope she takes a break to recharge and that I’ll see here like again driving IT forward.  Right now though, all I can feel is a deep sadness that it had to come to this.

New Experiences in IT

So in the last 8 months I’ve made a bit of a change, after 18 months in higher-ed IT I transitioned over to the public sector in government IT. Specifically primarily emergency response IT. It’s been an interesting experience, much more catching other people up and getting folks modernized, lots of realtime Geospacial stuff and lots of experiences with field staff. I had been getting involved with planning related Unified Central Virginia Emergency Services for the UCI Roadrace here in Richmond.  They haddn’t had much of an IT leadership presence in this space before and the IT skills are a bit thin so after working with me a bit they decided to tag me as the Tech Section Chief for the event.  What surprised me most was that this is considered a big step forward and they haven’t had IT leadership in events like this, which blows me away.  So much updating need in government IT but there’s a lot of dedicated people and broad sets of skills that with a few changes there is the potential to have a big positive impact.

The month of September has seen me more or less consumed by this though.  I think 2 days off total in the month with most days at very long hours, 12+ hour days each day for the last 2 weeks or so.  Looking forward to getting back in touch with friends and to whatever life holds for me next.  What an amazing experience, It’s such a privilege to work with professionals of this caliber in thier own field.  Richmond and Henrico is indeed in very good hands from a public safety point of view.

IT Management is counter to everything you know

One of most difficult challenges an organization can face is building effective IT Leadership. It faces the paradox of needing IT Leaders with strong technical background and skills who understand that leadership is the exact opposite of everything they’ve come to know up until that point in their career.

As technical experts we’ve spent most of our career jumping in and solving problems, taking pride in our ability to research and implement smart solutions. As leaders it’s no longer about what you can do, it’s about what your team can do. This can be supremely difficult because you must know enough about what needs to be done to exercise good judgement, but resist your urge to dive deeply into the implementation details and get distracted from your role across the organization. You also have to know your people’s skills deeply enough to understand what is a comfortable fit, what is a stretch and what is a gap for them and how to mitigate for it. You have to put your pride aside and not get caught up in the (often romanticize) notion of how you could solve the problem back in the day. You have to navigate the subtle differences between the tight control needed by an implementer and firm guidance required by a leader who facilitate them.

Our conceptional models of how we fit into an organization is strongly shaped by our vision of the day to day value we add. We have to be able to let go of that conceptual model to understand the role soft skills play in the organization in building our teams and organization over time. This can be especially challenging for anyone coming from the concrete world of implementation. We have to trade our immediate mindset of how we’re going to get our work done today for a longer view of how is this work going to get done in the future and continue to be done, perhaps even be an entirely different set of people, perhaps with an entirely different leader. We have to broaden our assessment of strategies to imagine a way to forge a trail ahead for the skills we’ll need next month or next year instead of what skills we need to get the job done today.

Leadership comes with a large set of challenges to begin with but the unique challenge in IT is that it requires the exact opposite of some of our most powerful habits and strongest mindsets up until that point in our careers.  A mindful approach to this transition is critical and there are a number of great books or resources to help develop leadership mindsets, but it requires recognizing the difficulties in the first place.

Executive Leadership in particular needs to understand these issues as they are the ones developing and choosing their organizational IT Leaders.  Too often they avoid the issue by choosing IT Leaders from a pool of career managers with little to no IT skills, which is often a fatal flaw, and introduces too large a gap between Executive Leadership and product implementation.  On the opposite end, Executive Leadership can sometimes simply advance someone to IT Leadership based on their technical skills alone which runs the risk of driving toward directionless growth of their IT products and an inability to sustain or replicate any success across teams or over time.

Running Ansible on Windows through Cygwin

For various reasons I’m mostly on Windows machines at work and at home but prefer to develop in Linux and provision with Ansible.

The Server Checkin blog has a great post on setting this up I had a few things I needed to do differently or in addition to the directions there I wanted to jot down for myself and in case anyone found it useful.

Bash the right thing

The directions point to setting up the ansible config settings in .bash_profile but in cygwin it points you to using (as on many bash setups) .bashrc instead so just make those changes in .bashrc instead.

Updating git submodules

The master branch checkout of Ansible I used for my setup needed a few updates for submodules.  I discovered this from some output after running `ansible –version`.  To update those just `cd /opt/ansible` and run:

  • git submodule update –init lib/ansible/modules/core
  • git submodule update –init lib/ansible/modules/extras
  • git submodule update –init v2/ansible/modules/core
  • git submodule update –init v2/ansible/modules/extras

After that it seemed to work fine for me, though I’m still trying to get over the Vagrant hurdle it mentions at the end of the post.

The future is Go’s to lose…

Go Language GopherIt would be hard to miss the splash the Go programming language has made in the software engineering community in the last year.  I’ve worked with it over the last several months and am pretty impressed by it, particularly for how new it is.  That being said though, it would be dishonest to claim that most of the buzz on Go isn’t hype right now and like any new technology headed for the trough of disillusionment, it has a lot of work to do if it’s going to stabilize into something that’s going to deliver on it’s promise.    Go is moving fast and given the state of languages out the right now, it has a unique opportunity to firm up a few things and become what people want it to be.  In other words, this is Go’s game to lose right now.

None of this is new, and the following may not be either but I thought I’d be one of the many voices tossing out some of the things I think Go urgently needs to change to take advantage of the opportunity it currently has.  So in no particular order…

Runes are going to ruin us…

For some reason Go decided to forgo a char (character) type in favor of a byte base Rune.  I’m not a character set guy so I’m sure there are good reasons in somewhere in the multi-byte or composing vs non-composing character bushes, but at the end of the day Runes are characters or at least people want to use them that way.  Getting esoteric with what should be such a fundamentally simple concept just seems like a bad idea to me.  Go does a great job of dealing with things on the byte level so I get the thinking behind Runes but the work it takes to treat a Rune like a char, which is most of the use cases, makes it feel like the language is getting the way to me.

Go Get needs to be more long sighted...

I seems kind of neat at first that you can import a go library using it’s GitHub or bitbucket path and import it with the Go Get command but I can’t imagine how this is going to be a good idea in the long run.  Linking a fundamental feature like imports into a low level language to current fads in repository practices seems like such an amazingly bad idea to me.  What happens in 3 years when we’re all onto the next new social coding platform or any number of other things change.  Go Get is neat but a poor (and dangerous) substitute for a a real dependency management system.  Nobody want’s to recreate maven, but maybe something akin to python’s pip would be a big step forward.

Better Collections and Generics

Anyone working with Go has heard this a million times so I wont go into it too much.  Slices, arrays and maps do generally work in my experience, so much so that the mantra of the community is that if you think you need lists, then you’re probably wrong.   Most of the features I find in common collection types from other languages can be built using these low level data types and the experience of doing it is a nice refresher in what is going on at a language level in many collections. That said though I think it’s sometimes confusing and having to explicitly manage slices gets tedious after awhile, mimicking sets out of ‘map[string]bool’ seems strange as does overuse of use the “interface{}” declaration.  The community debate on this is an interesting one and seems to come down to people expressing a desire for common language features either for clarity or convenience.   As you’ll see in my next point, I think we need to do a better job as a language community at valuing clarity. openness and learning and the division over collections is a small example of this divide to me.

Good community needs to be a core principle

As a new language and a community full of early adopters, which way the personality of the go community is going to trend is still very much in the air.    For my part I really hope to see Go follow the python community model to push openness (doing well there), diversity (hmm not so much) and develop a friendly and welcoming base (jury still out).  A trip to any of the Go communities is a very schizophrenic experience right now and while the culture is shaping up to be generally positive and helpful ( is a huge help here), we should be mindful that cultivating a strong community is a very purposeful act.  There are spots where grumpy engineers hang out still, wasting the energy to give snarky answers about wasting their energy that it can drive some people away.  Also the entrenchment around issues like Runes or Collections can quickly escalate debates on that topic to something nobody wants to follow.  I threw out the idea of a community code of conduct similar to the one the python community uses and was immediately attacked by parts of the community.    Who adopts Go and what they bring to the community, at this early stage of language and community development, is going to be almost as important to the future of the language as the evolution of the language itself.  Like the social evolution brought on by GitHub, I hope to see Go bring a similar evolution of the more hard core engineering community and open it up to new and diverse engineers in the community and in turn I hope that evolution helps us all become better engineers.

What’s your take on Go, where it needs to develop or improve or do you think it’s perfect where it is?

Enabling Vagrant SSH on Windows

Picture of old shoesDevOps tools like VirtualBox and Vagrant are the kind of tools that can make you feel like we’re able to cast off the boundaries of mortal realities and take our place among the stars.  That giddy feeling quickly wares-off however when you try your new powers on a window machine and, not so surprisingly, things don’t quiet work as smoothly as they do on Linux or OS X.

VirtualBox and Vagrant themselves install just fine on my Window 8 rig, and building a box and bringing it up works just fine as well, but things come to a screeching halt when you need to SSH into your running VM as windows just doesn’t have a functional SSH client at command line.  As most windows users will likely guess here comes Putty to the rescue, but it will need a bit of work.

My robot masters at Google eventually let me to a chain of threads that helped me work out how to connect Putty to vagrant and use the SSH key.   The gist of what needs to be done is:

  • The vagrant multi-putty plugin needs to be installed.
  • The directory with the Putty executable needs to be added to the Windows Path.
  • The vagrant private key in your %HOME%/.vagrant.d/insecure_private_key needs to be converted and saved to ppk format and with the ppk extension by puttygen.

So quickly

Install the vagrant multi-putty plugin, from your windows cmd line type:

> vagrant plugin install vagrant-multi-putty

Then add the directory with your putty executable to your PATH (Google it hippies)

Then vagrant generates a private key to use for ‘vagrant ssh’ in your user directory under %HOME%/.vagrant.d/insecure_private_key.  You need to download and open puttygen.exe and select ‘load’, navigating to the directory above and opening the key.  It will convert it to *.ppk format and you need to save the private key with the .ppk extension.

After that just ‘vagrant up’ on whatever box you want and type:

> vagrant putty

and you should be in!

RailsTutorial and Failing Dropdown Menus

Rails on Mac ImageI’m working my way through the very excellent RailsTutorials by Michael Hartl and ran into a problem I thought I’d not here related to gem versions and the 3.2 version of the book.

Throughout the book I was having problems with the twitter bootstrap dropdown menus not working.   It doesn’t become a problem until user sessions later on but when I got there I tried a little troubleshooting.

Checking out the javascript console I found the error:

cannot read property 'webkit' of undefined bootstrap

Which the nice folks over on StackOverflow point out is a version change in query that no longer supports the way one of the methods are called.  If you use a current version of the jquery-rails gem this means bootstrap dropdowns don’t work. the recommended version from the book is 2.0.0 but that has been pulled due to bugs.

To a Ruby and Rails Noob like me (RoobNoob?) it’s not apparent but using the line in your Gemfile

gem 'jquery-rails', '~> 2.0.0'

Will automatically load the latest bug fix in the 2.0.x line, which is 2.0.3 at the time of this post.  Presumably using current versions of jquery-rails and bootstrap-sass would get around this problem but I want to complete the full tutorial before I do much off-roading.

Normalizing Decency in the Development Community.

Adria Richards posted some very disheartening experiences she had at the recent PyCon, dealing with some awkwardly sexual bro-grammers in the audience.    I think everyone with an interest in developer communities or management should read it as it’s a great expression of what I think could be a too common experience.

I don’t want to rehash the whole issue here but there are a few things that specifically jump out at me as I read her experience that I think are worth noting.

I was struck by how much energy she felt she had to put into the descriptions of the incidents and her perception to feel she was justified in feeling outraged and how utterly draining that has to be to women in the development community.  This seems like one of those things that people should just get intuitively and wouldn’t require more than a tweet to illicit the appropriate WTF reaction I think it should.  This poor women has to essentially open a veign and bleed out all over her blog just to get to the point of feeling justified and from the reaction around the twitterverse, even then some people still have their doubts.

That people can act so inappropriately in large groups without some trigger for regulating it always a chilling thing to me.  In this instance a trigger did work in terms of the wonderful PyCon staff but the threshold for activation was just too high to call ourselves and inclusive community.  Active triggers are almost always a last resort option and form a more inclusive community we’re going to have to aspire to more passive triggers to become a self regulating community.

Why is this important to me?

As a profession, our job is essentially to make conceptual models real for people to use.   We have too much of a mono-culture in programming and that hurts our ability to create better conceptual models.  Diversity of background, thinking and personalities is an important tool for improving our set of conceptual models to solve problems in a diverse world. Anything we do to increase diversity and break the monoculture improves the profession.   Do more of that and don’t want for someone else to ask you to.