Tag: development

  • The Value of Getting Closer to the Work

    The Value of Getting Closer to the Work

    A raccoon stands upright in a surreal, upside-down landscape — a spoon-armed column, a floating hand, an inverted figure, and blue hill-creatures with little doors — picking its way through.

    Scaling

    The core problem of scaling a team is that not everyone can know everything. Scaling is the work of systematizing that – so that things are understandable, knowable. It’s turning “tribal knowledge” into documentation, automation, and process. It used to be that only the automation was for the machine, but now documentation is machine critical and process is machine readable.

    With humans, things bubble up and down. You don’t – in general – make systematic fixes for the first complaint. First you validate, check the scale of the issue. You try the softer interventions – trying to get people to actually talk to their team mates – before you start building process. Maybe you make a change a month to the way a team works. Carefully, thoughtfully. Because no effective person wants to be on a team where the job seems more process than impact.

    Automation was always the most effective, but also usually the most expensive. The thing that gets put in when “please follow this checklist” fails frequently and severely enough to be worthwhile. An incident can be the gift that delivers the agreement on priority that always seemed necessary to those close enough to it, by making the cost of not doing it clear.

    As we are deep in replatforming Twill, I’m back to being a developer, and as I operated my orchestrator and dispatched agents on the backlog, even though in some ways everything is wildly different, some parts of it that I reached for out of habit felt very familiar: scaling.

    +AI

    AI feels like speed-running some of the team scaling stuff that previously I orchestrated over months – years even. The economics have shifted to make automation much cheaper, so it’s no longer deferred, but top of the list.

    With people, knowledge lives in two places – in the people and in the systems. With AI, only the systems part persists. Every session starts contextless. This is the problem that surfaces all the documentation that wasn’t written, and all the automation that was never built – a core part of why building with AI from scratch is so much easier than retrofitting onto an existing setup.

    On DRI, when Jean started building the platform, we talked affectionately about “intern Claude”. Over time, we matured away from that framing. We put the guardrails in. We stopped treating it as a novelty to be supervised and started treating it as a system to be designed. With Twill, I started from a higher level of understanding, and the baseline was higher.

    The snark, which I’ve also expressed: people will do for a machine what they were never willing to do for their team. Write the doc. Define the work clearly. Build the guardrail. Forgive the mistake.

    I stand by it. But that doesn’t mean those of us who were always trying to do this for humans gain some moral high ground by not doing this for machines.

    The rigour was always good practice. The humans operating the machine will have a much better time if those machines are set up to succeed. I think the call for EMs to “get closer to the work” has been poorly expressed and executed, but at the core of it – having got much closer to the work myself – I have come to see the validity of it. The scaling problem that managers used to deal with is now happening at higher speed, and the only way to have fidelity on it is to understand the work being done. Because so far, there is no playbook – we all have to write our own.

    The best example of this is CLAUDE.md. For both DRI and Twill, it’s a living team artifact, and the churn on it is a good thing – the way of working should keep evolving, as we evolve our understanding, our work, our effectiveness.

    Three terminals

    “Dispatch a review agent” was encoded in our process for months. It’s very helpful. But I would still find the odd issue or untracked follow up. Then, tired of Claudes colliding on CI and wasting build minutes, I made a merge queue. It serialises merges across concurrent sessions, files the follow-ups, and sends PRs back when they’re not ready.

    The next round of reviews I dispatched came back clean. And the next. And the next.

    Turns out merge queue Claude, reviewing work it had no part in, was stricter than the Claudes that had done the work.

    The reason is the contextlessness. Which gets talked about like a strength or a weakness as we look for metaphors about working with this thing that is new and we don’t yet fully understand. I’ve given up on metaphors, and think this aspect, like this shift in general, is best treated as a neutral.

    The reviewer had no investment in the work. Nothing to rationalise. No “well, I did it that way because.” It knew only what the standard said and whether the code met it.

    So many times, after reading a review or finding something that didn’t work as I expected it to, I’ve thought that something should be already prevented by CLAUDE.md and asked why it wasn’t. The answer was always clarity – fair. But turns out, like humans, the answer could also be process.

    The common manager refrain on AI is that it separates those who think from those who don’t. Fair. But one of the core skills you have to develop in leadership is knowing what to pay attention to and what can be ignored. The broader your scope, the more you need to be brutal.

    How many times have I told someone “that’s not making it onto my list”? Too many to count. Enough that people have been known to text me when they find themselves saying it. Now, having so many things in flight at once, I’m always trying to figure out what to pay attention to and what not.

    The mechanical guardrail is encoded in CLAUDE.md: hit the same issue twice, stop. A lesson learned the hard way after burning a bunch of build minutes on something stupid, because it only got intermittent attention and seemed like it should be fine. It’s inclined to keep pushing through, but telling it to stop also tells me to stop, to give that problem some attention, to think.

    Before, the discipline was: you found a bug, you wrote a test so it wouldn’t come back. Good practice. Now, I do that, and then I ask: how do we guard against this class of problem?

    Competent humans rarely make the same mistake twice. AI will make the same mistake endlessly.

    Making a class of issue impossible is not cheap. This is why we didn’t use to do it. A minor bug spawns five-plus follow-ups – graduated solutions of increasing complexity. A null-handling issue that threw 500s; fixed in one PR, but the follow up issues to eliminate the pattern and add a tripwire in CI so it can’t come back got added to the backlog, ready to be picked up, implemented by the orchestrator as a slot becomes free. Done within the week. Because now it’s possible. It’s tractable: it’s bounded, well-defined work, which makes it exactly the kind of thing you can hand to an orchestrator and let run in parallel.

    I keep reading all this stuff about “working with AI” and it’s so depressing that most of it seems to be about building things that run AI agents. What’s the point of it? What are you actually shipping? Is this just some game, like The Sims: But Make It Programming (and also really expensive)?

    Cranking through a bunch of stuff to launch, I’m running Claude in three tabs. The first is an orchestrator. The second is the merge queue.

    The third is the terminal where I actually define, decide, and unblock things. The most important one. In this one sometimes I feel like a product manager, sometimes an engineering manager, sometimes an architect. Sometimes I’m just wiring up secrets and things, feeling like some modern day version of the ENIAC women who used cables and switches. At least I get a manual.

    Scaling a team, you keep coming back to the same need: be clearer. Clearer about what’s expected, who owns what, what good looks like. Clarity. Clarity. Clarity.

    The work of the third terminal. Clarity.

    The tools have changed. The work is the same.

  • Dimensions of Engineering Growth

    Dimensions of Engineering Growth

    Image by suju-foto from Pixabay

    One of my coaching clients and I developed this framework to help him think about the kind of impact he wanted to have as a Staff+ engineer, and since then I’ve taken it to other clients and direct reports in a way to think about engineering growth outside of any particular job ladder.

    The four growth dimensions are:

    • Scope
    • Complexity
    • Output
    • Agenda

    Scope

    What it means: Scope is the size of the problem or responsibility and is relatively straightforward to quantify in LOC (Lines of Code) or people involved.

    • For ICs, this often goes bug -> small feature -> large feature -> multi-feature project -> …
    • For managers it’s often TLM (Tech Lead Manager) for small team -> manage team -> manage managers -> manage managers of managers …

    Failure mode: The failure mode of growing in scope is often need to control. What is possible to control in a small team or project gets progressively harder over time. Everyone reaches some kind of limit there (admittedly some much later than others).

    Inflection point: Figure out how to get the outcomes you are responsible for with different mechanisms than that of control (documentation, setting standards, coaching and mentoring, reporting, pro-active checkins etc).

    Opportunity: As scope changes, think about how the way in which you work needs to change. Whilst we might fix a bug using a debugger, it’s much harder to develop a complex feature like that, and so that increase in scope is an opportunity to adapt and grow. This continues as you take on more responsibility; you cannot (effectively) manage managers the way you manage ICs. It’s worth noting that sometimes in our careers we might take a decrease in scope – for example when we change jobs and have to onboard through fixing jobs, or go from managing managers to managing ICs in a smaller organization. In these instances we will also have to adjust our approach to our renewed scope in order to be effective.

    Complexity

    What it means: Complexity is the difficulty of the problem, and more difficult to quantify – sometimes it takes some amount of domain knowledge to know what is challenging.

    • For ICs complexity is in the projects, the complexity of the feature, the problem space, or the code base.
    • For managers complexity is in what is being delivered and how. What is being delivered is the complexity of the product, managing a team building a CRUD app is less complex than managing a team building a more specialized/unique application with a greater variety of client side work. How it is being delivered is the way in which the tean works, for instance a team that has to manage more stakeholders (such as a platform team) may have higher complexity than a product team. 

    Failure mode: The failure mode of complexity is the continuous increase in complexity. Effective scaling (of an individual or a team) involves the transformation of complexity, where something that was complex is made simpler in such a way that it can be more sharded.

    Inflection point: Complexity is often a point where engineers around senior get stuck. Having worked with continuously increasing complexity, they either make things more complex than they need to be, or persist a high level of complexity that needs to be simplified and sharded.

    Opportunity: Take a holistic view of complexity – complexity is not just the code, but also the product and environment it exists within. Focus on outcomes to resolve and reduce complexity in such a way that it allows others to be successful.

    Output

    What it means: Getting things done, or causing things to get done.

    • For ICs this starts with an initial focus on raw individual output, and progressively shifts to enabling other people over time.
    • For managers this is the output of your team or org, over time. Over time is important, whilst you can create short term output at the expense of things (underlying work, attrition), you will typically pay for those in the form of lower output later. This means being able to balance an increasing amount of disparate work whilst maintaining a good rate of output consistently.

    Failure mode: Short term thinking. Individuals who focus on their own effectiveness at the expense of the team, managers who push short term output at the expense of longer term team functioning.

    Inflection point: Recognizing when output needs to happen through other people rather than individually. Balancing short term pressures with longer term impact.

    Opportunity: Take a broader view of output, identify where you can overall increase output outside your own individual efforts (through other people, via processes, tooling, architecture etc).

    Agenda

    What it means: The driving force of what you’re trying to get done. As you progress through an organization you will have to balance a broader agenda, ultimately driving the agenda of the entire organization, and navigating conflicts between that and the agenda of individuals or teams.

    • ICs often focus on their own work or team, but at Staff and above typically need to hold a larger agenda around an area or domain.
    • Managers need to fit the agenda of the team within the overall agenda of an organization, tying it to work that impacts the business.

    Failure mode: Taking too narrow an agenda that conflicts with bigger agendas. Such as the IC who pursues their own interest at the expense of the overall team, or a manager who is too focused on the team they manage versus taking a “first team” (peer) mindset.

    Inflection point: Moments of conflict between an individual or team agenda and an organizational agenda.

    Opportunity: Look for places where there is an opportunity to tap into a broader agenda, whether it’s focusing on the team’s needs rather than your individual needs, or the goals of an overall initiative rather than the pressures of the project.

    Making it Actionable

    When working within a job ladder framework it can be a challenge to 1) separate out evaluative feedback from developmental feedback and 2) truly focus on growth rather than trying to check a box. As such, I hope this can be a neutral tool you can use to consider how you can grow, and what kind of growth would support your actual career goals. It’s fine to enjoy scope more than complexity (and vice versa), the main thing is not to allow something to hold you back by becoming a controlling weakness.

    The first step is to identify one of these to actively work on, bring awareness to it, and execute on a plan to deliberately try to improve (whether through stretch assignments or deliberate practice).

    Good luck! Let me know how you get on.

  • The Rent Versus Buy of Career Growth

    The Rent Versus Buy of Career Growth

    The topic that got the most attention in my previous post about being the DRI of your career is the concept of rent versus buy when it comes to managing your career.

    Distinguish what your employer rents versus what they buy. I find this particularly relevant when it comes to things like “personal brand”. My employer buys my time, they rent my personal brand. To that end, I’m conscious that whilst it’s part of the value I bring, I don’t want it devalued because ultimately it’s my asset for the long term. This concept also applies to expertise. My expertise is rented, and so I maintain my understanding of what it’s worth, and what is current on the open market. If your job does not match the market in a way that will make it hard for you to find another one, I hope your employer is paying a lot of rent – because they are destroying the market value. At times that might be worthwhile, but often it is not, and people realize that too late.

    Here, I’ll expand a little more on how I think about that, but I’d also love your input on how you think about it and what examples you would place in each. Leave a comment, ping me on Twitter, or drop me a note.

    Rent

    When you “rent” something out, you retain ownership of it – the renter just gets the use of it. As the long term owner of the asset, it’s on you to be conscious of the value, and make sure the renter is not destroying the value long term.

    Expertise

    Expertise is a key example here. Your expertise is yours. It’s what will help you get your next job, negotiate your salary (oh hai “market value”). Because “professional development” is a core retention strategy in tech, too many people are complacent and outsource this responsibility to their current employer, instead of being strategic in how they consider their own development. This is why there’s discussion about “staying current ” as a developer. We used to hear the phrase “there are a lot of unemployed COBOL programmers”, and now it’s more like, there are a few COBOL programmers, they make a lot of money, largely from banks or the government.

    This piece is often where the side project dialog goes off the rails. Should you need to do side projects to get a job? Are open source contributions a requirement? I am a hell no on both these points. However, being strategic about where you invest resources (time and money), and/or developing a habit of deliberate practice can help you develop your expertise and command a higher rent on the market. The extent of that investment is up to you.

    I think developers, if they are lucky, can largely get away without thinking too critically about this, because professional development is a core retention strategy of most “good” tech companies. But at smaller companies, levels above senior developer, or in management, training is often limited and deficient, and if the individual doesn’t take control over their own growth they will hit a ceiling. 

    As a hiring manager, the biggest mistake that I see people making in this realm is the resume that shows “X years of experience” (where X>=6) but when you dig in you see the same 1-2 years of experience again and again. These people top out, stop getting recruiter pings and they don’t know why – but it’s because they didn’t consider how to grow their expertise as they switched (or didn’t switch) jobs. 

    Brand

    There used to be a lot of discussion about “personal branding” and frankly it was nauseating. But, as an individual we all have a “brand” or a “profile”. At a minimum, it’s what’s on your resume, and how you build the narrative of your career. Some companies or roles are detrimental to that. If you work at a company that is materially contributing to (and profiting from) the collapse of society, that may reflect on you.

    A common mistake I see is where people have a job title or custom role that does not match the market. Companies sometimes try to pay their “rent” in inflated job titles – I’m extremely skeptical about the value these have on the open market. For a good recruiter or hiring manager, a “VP” or a “Director” job title without an expected scope of responsibility opens more questions than it answers. It’s worth mapping your responsibilities to the expectations of the market periodically, and checking that you’re still generally employable – hybrid roles where people do A and B are particularly susceptible for not meeting the criteria of either A or B externally. An “and role” can be a plus when you do one thing particularly well but have additional skills – for example an engineering manager who does some product work, or a designer who also does some CSS. “And roles” where people do two+ jobs, poorly, do not set people up for success in their broader career.

    But for those of us who have a bigger profile, some recognition in the community, the concept of brand goes beyond the resume. In a leadership role or DevRel, but to some extent elsewhere, your profile and ability to attract talent is part of your value to a company. It’s important to remember that you retain ownership of your profile, and that it’s for the long term. You don’t want to be seen as a shill for a company that later turns out to be problematic.

    I saw a tweet lately that made me think about this; the company thought they were buying this person’s profile. But she was clear it wasn’t even available for rent.

    This point on brand doesn’t apply to everyone, but where it does it’s worth considering carefully. My main point here is: boundaries. Think about how you want to use your profile, what options you want to be available to you, what boundaries you want to set around it. Make sure that you’re balancing between the rent and ongoing market value. 

    Attention / Context

    Attention is also rented. What do I mean by that? Often you work in a particular domain, and you pick up things about it. Maybe you work in fintech and you acquire a bunch of knowledge about financial regulation. Maybe you work on web standards, and acquire a bunch of knowledge about governance. Maybe you work in Open Source and acquire a bunch of knowledge about licenses. Your attention is directed by your domain.

    When you leave, you take with you that context and what you learned, and that can help you elsewhere. Personally, I’ve been working in Open Source and building remote teams for a long time – those things have had my attention, now I know a bunch of stuff about them, and that is one less thing anyone has to explain to me when I switch jobs. In another part of my life, I did a bunch of work on presentation software and picked up various things about file formats and rendering. At times, I use these bits of information. It’s like a shorthand; I can more quickly evaluate a resume, or the likely complexity of a project, because I have that domain knowledge.

    The win of attention is a little additional curiosity can result in disproportionate amounts of learning given current context. Later, you have these bits of useful information that you can use to accelerate things. Being conscious of how you allocate that can make a difference and make more opportunities available – whether you go deep, or pick up complementary / adjacent contexts. The mistake of attention is when people think they know a domain, but really they know a company. I remember the interview where someone told me they were a “$domain guy” when their understanding seemed very limited to questionable business practices of one particular company which… okay yes, did have a product in that domain.

    Buy

    If some things are rented, what is bought? 

    Time

    Time is the obvious one, typically part of the working agreement, officially around 40 hours per week. Some jobs are more than that for whatever reason, and should pay more as a result.

    The time aspect is interesting, because research shows that in senior roles, they are more likely to be held by men, whose wives are less likely to work. Women in these roles have fewer children, and are more likely to be single (source: HBR, see also: “7 in 10 men who have enough income to put their households in the top 1% of earners have stay-at-home spouses” Qz, “Why promoted women are more likely to divorce” BBC).

    What I take from this, is that the time commitment of certain roles is such that it’s extremely challenging for someone to have such a role and be a parent. Those roles are compensated highly because it’s essentially compensating for the time of two people, where one is the “worker” and the other is the person who makes that level of work possible. The US presidency is perhaps the biggest such example, and one of the interesting things about Dr Jill Biden continuing to work at her usual job as a Professor, is that the position of “FLOTUS” (the unpaid second position that comes with POTUS) has to be filled at least somewhat by people who are actually paid… themselves… to do the work.

    Working in a distributed context for years, the biggest mistake people make with time is that they don’t manage it well. Some people cannot cope with the flexibility, they fail to give themselves the structure they need to be effective. The other failure mode is the opposite – people struggle to disconnect from work, overwork, and burn out (for more on this topic, see: Figuring out Remote Work is Figuring out Work).

    Energy

    I include energy as distinct from time, as I think it’s what explains the continual gap between the hours that people work, and the hours that people think they work (much more). My theory is that when people think about how much they work, they count the energy that they spent. When they track the time, it’s more concrete. So a long dinner with friends is definitely not counted as “work time”, but if you’ve had a shitty week and spend half of it emoting… it counts energetically.

    Dysfunctional environments are an energy drain way beyond the time commitment, and typically way beyond what you are actually compensated for. Thinking about it this way is an encouragement to set boundaries, or – if they aren’t respected – draw lines (like turning the phone off, or ultimately look for another job).

    Adherence

    Adherence is the agreements we make as part of any employment contract. Some jobs don’t allow people to do any programming/writing/speaking externally, and this can be a lot to give up. Maybe you have to live in a certain place, work out of an office, etc. In distributed contexts, travel used to be one aspect of adherence. When hiring at my last job, we would be super clear: 49 weeks of the year, you are wherever you like. 3 weeks of the year, you need to make travel work. It wasn’t for everyone, but I think that is normal and expected; not everything is for everyone.

    If your employer is buying adherence, then it needs to be reasonable. Perhaps no amount of money would make you go back to an office – totally get it, but if your employer thinks they have paid for that, you are going to have to figure a way out of that disagreement that may well involve finding a new place to work. Personally, I can’t imagine selling my ability to write and code for fun ever again, but earlier in my career I made that trade-off for a while, and paid for it later. 

    Trade offs

    Thinking about career decisions this way, you can consider different tradeoffs and options that work best for you at any given time. As an employee, it’s typical to allocate more time, more energy, and in return typically receive higher levels of investment in expertise – this helps people grow more, and ultimately earn more over time. The benefit of different working relationships, like contracting, is often to set stricter boundaries around time and energy, which can free people up for other things (or just maximize short term income). I can’t emphasize enough that all choices are valid and that people operate from wildly different constraints, many of which perpetuate systematic inequity. My question is: are you making those choices mindfully? And do they work for the life and career you want?

  • Estimations and Orders of Magnitude

    Estimations and Orders of Magnitude

    apple-measure.jpg

    Call me a cynic, but I don’t expect software estimations to be accurate. Because software is built by humans – and they take sick days, and vacations, time to help their colleagues (hopefully), have off days as well as good ones.

    But I still think estimations are worth doing. Firstly, because if we don’t have some reasonable concept of how long something will take, how do we compare the effort and impact of A vs B and make any kind of rational decision?

    Mainly, though, because the order of magnitude by which we are off says something about the project. We should be off by an order of magnitude smaller than the one we estimated in. I.e. when we estimate in months, we should be off by weeks. When we estimate in weeks, days.

    Being off by an order of magnitude smaller allows for humanness and human error.

    Being off by the same order of magnitude we estimated in suggests the project wasn’t thought through enough at the outset. It makes a case for spikes, and discussions, and architectural reviews.

    Being off by an order of magnitude larger than we estimated in suggests something went truly wrong. These are the projects that drag on and on with no end in sight, and sunk costs too deep to rationally contemplate. They sap the morale of the team and destroy your reputation – internally if not externally. They are usually a sign that some bigger change is required.

  • On Boiling Frogs and Drowning Rats

    On Boiling Frogs and Drowning Rats

    232636845_5ca3c4fe51_o.jpg
    Credit: Flickr / Mad Visions

    Beau recently tweeted an observation I made to him, which people reacted to… Something to do with “plague animals” all “ending up dead”. And well… maybe it isn’t my best management metaphor.

    It’s a metaphor for how we expand people’s comfort zones – the way we want to give people more responsibility gradually, as it feels possible.

    I suspect most high achievers have a point where we go from energised to so overwhelmed by everything we grind to a halt. Keeping people (especially new managers) in the space where they are energised, and catching as they head towards overwhelm is part of the job. It’s great if people will realise it themselves and surface it, but if we haven’t built a relationship such that they feel they can bring it to us… what are they going to do?

    This is the failure mode – people drown in the sea of things they have to do, with nowhere to turn.

    Some people like to be thrown in the deep end to figure it out, but thinking about this metaphor I realise that people who thrive when thrown in like rats are people who have built up their own resiliency and support. They’re not really being thrown in, because they have a parachute to deploy and a support team on standby, ready to help.

    Which also clarifies that part of the frog boiling is to help people develop resilience – and a support network. I tell everyone around me that when their job gets harder, they should make a friend. Coaching is also amazing for helping develop resilience (and self awareness) and I encourage everyone to take advantage of it (if they can). But as a manager, how you react to the inevitable failures of people on your team – do you react with kindness, understanding, and coaching?

    Or do you do you take your broken trust out on the person, destroying the relationship between you in the process?

    How do you react to your own failures? Do you display the same accountability and commitment to learn that you ask of them? Or do you embrace a double standard?

    As I think more about this metaphor, I see that the art of change management is the art of frog boiling. As much as we might be tempted to throw grenades in there “for speed”, consistent temperature and stirring will yield the highest number of live, temperature resilient frogs.

  • Empathy and Mobile Development

    Empathy and Mobile Development

    Credit: Pixabay / techlec / 140 images
    Credit: Pixabay / techlec / 140 images

    One of the (many?) things my team may be tired of hearing from me is “empathy is part of our job”.

    What do I mean by that? Well as mobile developers, we are the closest to the humans that use our product. We need to have empathy for our users – what do they need? What’s their experience?

    For me empathy starts with a foundation of self-awareness and self-care. It’s a lot easier to consider other people’s needs when my own are being met.

    Then, we can build on that with empathy for each other. If you can’t find it in you to connect on a human level with the teammate you work with every day, how do you find it in you to connect with the abstract idea of a human using your product?

    What does this mean? Because honestly this phrase even for me invokes some nightmare scenarios of codependent emoting. But what I mean is the practise of seeing someone else’s perspective. Listening to each other. Valuing each other’s strengths, and not judging each other for our quirks.

    We could start with a culture where we don’t blame, where instead we look at our processes and consider how they have contributed to the situation. Then, we improve our processes. Our “culture” is defined by our processes, afterall.

    It’s a pyramid, and at the top is empathy for the user. We have to care about them. What they are trying to do, and in what situation, and on what device, they are trying to do it.

    For me, the practise of empathy is mainly taking a moment to see the other side. But how do you do that for an abstract person? One example is that when I’m frustrated by fragmentation on Android, I remind myself that fragmentation is mainly a problem on lower-end devices, and as a result lower-income users. And then I feel a lot better about spending time on it. When I’m trying to prioritise anything to do with personal information I think about how upset I was when GMail changed my name and I couldn’t change it back and that reminds me how that would be even more upsetting for some other people.

    Basically when I look at some large piece of engineering work and ask how important it is, I ask, who is it important to?

    Thinking about this left me with one question – can you have empathy for the user if you don’t have empathy for your team-mates? Or, can you build a functional product without a functional team?

    The conclusion I came to was that I think it’s possible, but I have never seen it. I think the answer as to why is that emotional energy is exhaustible, and if you spend it fighting for or defending yourself, there’s less of it when you need it to fight for, or defend, an abstract person you’ve never met.

  • Over-Engineering Culture, Hacking, and Complexity

    Over-Engineering Culture, Hacking, and Complexity

    Bora Ultra Two Dark Cult (6)
    Credit: Flickr / Glory Cycles

    I was talking to a fellow escapee of The Conglomerate and we were talking about over-engineering culture. In the sense of “lol things built because it was time for someone to get promoted” and in the sense of complexity.

    The thing about layers and layers of (debatably necessary) abstractions is that they make things that should be simple, complex. Which makes people feel stupid. The last change I committed there I was adding one field… and I had to change > 15 files. The biggest problem I had? Was thinking I must be doing something wrong because it couldn’t possibly be this hard to add one field, right?

    I think of hacking as fixing one corner case only to make two more for later. So, reflecting on this, this is also true of a culture where things are hacked together. Because when hacks build on each other again and again, the result is that simple things become harder (and slower) than they should be. It makes people feel stupid.

    We often talk about these two cultures like they are completely separate but this is not true. They feed on each other.

    • Hacking can be a result of over-engineering culture, because things that can’t be done “correctly” may as well not be done properly at all.
    • Hacking can be a reaction to an over-engineering culture, because people tired of things being so hard want to move fast and break things.
    • Over-engineering can be a reaction to hacking because someone bitten by too many corner cases decided that it would be better if everything were a perfect circle.
    • Over-engineering can be a reaction to hacking because perfectionism can be a reaction to things constantly breaking.

    Personally, I like to think about the medium term. Essentially this means: don’t hack things because hacks are short-term. But just because there might be a reason why something won’t expand to fulfil some other purpose doesn’t mean that it should be generalised (yet). If that scenario is uncertain, and not in the current timeframe, document and move on.

    Hacking to over-engineering isn’t a scale, it’s a circle. At the darkest part where they meet, simple things are hard, and engineers trying to get to grips with it feel stupid. Thinking about it, I’m not sure whether that codebase that required fifteen files to be changed to add one field was over-engineered or made of hacks, but does it matter? The effects were the same. Move slowly, with things that barely work.

  • Multiple Cellphones: How I Balance my Usage Across Both

    Multiple Cellphones: How I Balance my Usage Across Both

    KONICA MINOLTA DIGITAL CAMERA
    Credit: Wikipedia

    I have carried multiple cellphones for about 2 years now. I think as a mobile developer, it’s important to be familiar with both the major platforms (iPhone and Android) and I find the context helpful regardless of which platform I am working on.

    Currently, I carry an iPhone 5 and a Nexus 5. My Nexus 5 is my “primary” phone – it has my UK sim card in it, and as such is the one that I use when I am not on a wifi connection (not that often, since there is wifi at home, at work, and in the gym). My iPhone has a US sim card in it, as it is now my designated travel phone. I use this to listen to music, and (almost) all the pictures I take, I take on my iPhone.

    A couple of things:

    • The apps I use most (chat, Twitter, 4Square, Feedly) are on both.
    • Email and calendars are synced on both – not that I use email on my phone much. Now that I’ve eliminated most junk mail I get notifications for personal email on one phone, only.
    • Necessary apps that aren’t instant are only on my secondary phone – this includes banking apps and personal activity tracking apps. This forces me to switch over periodically.
    • Also, music and pictures.
    • I make an effort to switch to my secondary phone when I get home and ignore my primary. Same in the gym, where there is free wifi – I leave my primary phone in my locker, and take my secondary with me to the x-trainer (with my iPad – I now tweet and watch TV whilst I get my cardio).
    • In fact basically anywhere with wifi, I use my secondary phone.

    My usage is the best it has ever been, a big factor in which is that I actually love my Nexus 5 enough to want to use it (a level of affection I never managed for my old Galaxy Nexus – I think this is mostly the beautiful screen), but after the first thrill of getting it, and a brief period of neglect for the iPhone I’ve found a balance.

    I think, on the whole I slightly prefer my iPhone – the great camera, and all my music being on iTunes is great – I can play music on my Apple TV, and then when I head out the door I plug in my headphones and it continues right where it left off. Also, some apps are better on the iPhone, Twitter being a big one – the Android app is much more likely to lose my place in the stream, which annoys me, and the clicking out to launch chrome rather than the embedded web view is slower. Also on Android, you don’t see the page snippet in the expanded tweet view (sometimes enough that I don’t need to click out). Although I use Buffer on both, and it’s so much easier on Android, because of the share intent. In fact sometimes my workflow is that I go through my favourites (which I use as a mechanism for things to read later) using both devices (web page loading being the bottleneck) but do all my sharing from the Android.

  • Mini-Generation Gaps

    Mini-Generation Gaps

    One Laptop Per Child
    Credit: Wikimedia

    When I gave the Holiday Science lecture, one of the things that I touched on briefly was how my childhood was unrecognizable compared to the childhood of children 10 years my junior.

    This article – The Children of Cyberspace – from the New York Times elaborates on that further. From the article:

    “Researchers are exploring this notion too. They theorize that the ever-accelerating pace of technological change may be minting a series of mini-generation gaps, with each group of children uniquely influenced by the tech tools available in their formative stages of development.”

    Lately, I’ve been thinking more about this and how technology education needs to prepare people for the future – both in terms of how we encourage children to take an interest in informatics (Computer Science) and what they’re taught when they get here. I’m starting to work out the details for a presentation, which I’m thinking about calling “Preparing for a Revolution”.

    What do you think? Any suggestions?