Today was my first day as a Thoughtworker. Wow, first real job ever too. It was mostly induction/admin-y type things and getting to know the company, it’s mission and what it’ll be like to work there. Well it’s all second hand (at least) info, so I’ll find out for myself. People seem good and I really like stuff so far. A nice thing someone stole from somewhere and said in the context of doing things is “don’t ask for permission, ask for forgiveness”. Made me think a lot and I agree somewhat, at least I can think of lots of situations it might be a good idea to apply that to. So there are lots of things to do, I feel a bit overwhelmed, not rushed but I do have to make decisions about what is important right now. Anyway, it feels like a new phase of my life and it feels right. Like I’m building and for the first time I have lots of blocks…
I wanted to use React Native because it’s JS based, which I’m familiar with, is talked about being great by lots of people on the internet and I wanted to see what the fuss was about. It’s a very nice simple framework because most ‘new’ things are just how components, props and state work. Components are like classes or functions which return/render a piece of JSX, or templates, stuff that you want to display on the UI. That’s the main purpose in life of a component, to render some stuff. Props are immutable properties that components can own or that can be passed to the component. State is sort of like mutable properties of a component, stuff you might expect the value of to change over time, maybe a user is control of it, like an alarm time for an Alarm app.
Anyway the app we are making is not trivial, it’s a social media app for doctors. The idea is that they’d be able to have a feed and post about cases (patients – who remain anonymous) and upload content such as photos of rashes or something and notes. The would also have teams that come together around cases and can have tasks. Just a communication and knowledge sharing tool basically. Working on it is very fun. I’m learning so many new things about React and also just async stuff. I have to actually hold myself back from enjoying it and just spending all day on it because I need to learn Java also for Thoughtworks. So now I’m going to get back to Java and I’ve left myself an hour to indulge on the React App on a train ride later tonight.
Happy leap second year!
This weekend I went to a hackathon held at JPM called Code for Good. It was really designed for Comp Sci soon-to-be grads, as a sort of grooming fun event and also a charitable event good for promotion I guess. Anyway it was a big event with a lot of press. 4 charities came and pitched problems they were facing and teams had to choose their favourite charities and then teams were assigned to charities to address their problems technologically. Our Makers team of 4 was awesome. Obviously since I’m on it 😛 We got assigned to our first choice charity, Edulution, which provide “effective and affordable” education in Zambia. A raspberry pi serves up to 30 tablets and is powered by a portable solar panel battery for 12 hours, this kit is given to a ‘coach’ as a mobile learning backpack. The coach is a local young adult/teenager who is responsible for gathering young students and giving them the materials. The kids sign in and learning content such as Khan Academy’s (KA) Numeracy course is available to them. They use the KA Lite API, which is an open source offline version of KA’s content.
The challenge that Edulution had pitched to us was twofold really. One was from the front-end, currently their app was hard to use from the point of view of a 5 year old who can’t read, so intuitive usability, iconifying and gamifying the UX was one important challenge. Another challenge was to make good use of the great data being collected on students’ performance on different exercises associated with each educational resource (video by KA). This is really amazing data which gives lots of potential for optimizing the learner’s growth. So our team decided to make a unique learning journey which is dynamically recommending you the next best educational resource based on the population of students who were in a similar position to you historically and seeing where they went next and choosing those that were most ‘successful’ by some metric we proxied up. I worked on this data-driven recommendation, on the back-end. Anyway it involved parsing .csv into JSON and then grouping rows by user id and then ordering each user’s rows by timestamp, effectively yielding data akin to a ‘path’ of their learning where each row was an instance/experience (they completed an educational resource and got a score). From these paths/user we anonymised and generalised the data into a graph of the population, where nodes were educational resources and edges were weighted by scores. Then we had a graph which we could query any node and work out where the best child route was and recommend that node (educational resource) to the child. That’s the high level picture anyway.
So I was surprised when we presented in the first round, charity specific round, and won, because there was at least one other team that I thought did a good job. They also did some learning algorithms and recommended resources. So the first winners were 1 team per charity. There were originally around 6 teams per charity. So we won that and then the 4 finalist teams (there were 4 charities) presented to the whole hall. It was amazing to see what things the other finalists had made. One team made a game for an Alzheimers charity which was a maze in which you get artificially distorted game play in very specific ways that try to simulate what it’s like to have Alzheimers, with the goal of raising awareness and empathy around the disease. Then there was the 1st place winners who made something so cool I can’t even summarise it. It was like a system with an app and website which allowed doners to take a photo of a thing they wanted to donate and then upload it, put a price on it (that would go to the charity) and then someone would buy it and collect it. A full system for this.
So in sum, really enjoyed that experience, although I think we didn’t need to stay awake so late, we were really inefficient after 2am. Might have been better overday not overnight. Anyway, hackathons are generally often awesome. We had an amazing mentor (each mentor looked after two teams) who had both his teams come 1st and 2nd (us!) overall, which is extremely unlikely, but he was a slave driver, and very nice (featuring below with the rubber duck in hand) 🙂 So really grateful to everyone who made that day possible, to my team especially and to Edulution for the great work they do, oh and to Makers for making me able to do that. I could not have done that a few months ago.
For the last few days I’ve been helping a friend with her coursework for a programming module, she’s doing a Masters in Cognitive Science or something and all good researchers need to know how to program a little, since they need to work with data and often large amounts of it. Computers are just faster and more accurate than us for that. Anyway I’ve been teaching her application of the basics. She had learnt in lectures the theoretical basics (loops/ifs/functions) but never done anything practical. So she thought a weekend of solid work would be enough for the assignment, but it was really not. You can’t anticipate what you don’t know will get in the way. Things never go smoothly with programming, especially when you first start. There are always errors, bugs and problems to be solved. But when you are just starting out, that can be really overwhelming, how things constantly break. Anyway we are doing some file I/O and data wrangling, mostly slicing, joining, stripping, popping and transposing, converting data structures and cleaning the data. I can’t say it’s been easy, we’re almost done. There’s one barrier which is removing ‘duplicate’ files. They’re not real duplicates but sometimes data was taken twice from a participant in the study (she is analysing a study’s results) and we want to keep one version only. So we need to open each file and check if the unique identifier of the participant matches a row of already processed data and if so, skip that file. Somehow I’m finding it a bit hard. The first obstacle I found with this was to continue/pass from the outer loop in a nested loop. The second obstacle was the matching of unique id not working because the data was infested with ‘\n’ at the end of each string. So stripped all that out. Now I’m debugging to see why its still not working, getting visibility and narrowing the loop but still quite stumped. Another pair of eyes or even rubber ducking seems like a good idea right about now.
What an odd title for this blog post? Are you surprised? Intrigued? Annoyed? Sorry, I’m indulging by projecting feelings I would have if I visited my blog knowing what I do about it and saw a post titled this way. Well it’s not a typo you’ve likely gathered. It’s the title of a talk given by a guy which has just inspired me to write this post super fast as I’m being kicked out a cafe. He speaks to Princeton graduates about the luck involved in his journey to wealth and fame. He brings up how often with hindsight we overlook the role that luck played in the development of favourable outcomes because it is easier to think things happen for a reason.
This seems highly relevant to me. Every day I feel this luck viscerally in the form of imposter syndrome. The sheer serendipity of events that led me to be where I am in life now, going where I am going. A part of me wants to believe I was chosen for this scholarship and job because I have some unique desirable qualit(y|ies), considering how much they fund my development and invest in me upfront. That they genuinely do believe I will give back all the value they have lent and continue to lend me. A part of me does or wants to believe that. But another part knows there was a lot of luck involved. I googled ‘scholarships women tech’ on a whim. I was at uni 2nd year just finished, supposed to be collecting data for a dissertation that my heart and mind had not committed to, like every decision I had been forced to make thusfar.
Because, reader (if there is/will be), when you don’t have resources and support, be those material or non, it is really hard to craft a path for yourself and decide what the best course of action is. Because specialising is risky. You must sacrifice all the time just to decide how to spend your time you are sacrificing all the other possibilities. So I was buying my time until I found a direction that magnetised with me strong enough. But buying my time just meant surviving. I dropped out of uni after the first 3 months, I was 18. I travelled on no money on and off, odd jobs super short term, but mostly living off the kindness of others temporarily and always moving on, this lasted around 3 years, including living communally. Then again trying university, because, well I needed to support myself, maybe I could use my student loan to pay for training in something with faster return, iterative improvements towards an unknown goal. Agile agile. I became a massage therapist. But it was luck, pure serendipity, that some things happened. That an ex partner asked me to join them to a hackathon and I became inspired and obsessed. That I then changed my degree from BA to BSc. That I then allowed my impatient frustrated self to act on that familiar emotion and frantically google ‘ways out’, or into something that would be more exciting for me than academia. With faster learning, a better environment, better tools.
All of those were intuitive decisions, so luck in a way. I could have clicked another scholarship link in the google search, not Thoughtworks’. I could have thought that because the odds were against me the application was not worth my time. It was true. But also I didn’t value my time as highly at that moment in life because it was not as exciting and as clear to me regarding what to do as it is now. More luck came when I was successfully passing each stage until finally I was chosen. Then more when I couldn’t pay my rent and I was helped out. More when I met a partner I really liked. All the good things seemed to happen randomly, all at once and without an obvious reason. I obviously want to search for reasons from a hindsight point of view. Obviously I only met someone I really connected with because I was happier in life in general. Obviously I only passed TW’s technical test because I put effort in because I had been given an opportunity and wanted to prove myself, or for fear of failure. It’s easy to reason away with hindsight. But maybe the interviewer’s were just feeling kind that day. And all the other days too. Maybe someone else inadvertently influenced their unconscious decision making faculties. Maybe my partner would have liked me as much if we’d have met a year ago. I don’t know.
Literally there are infinite possibilities involved in each step of a given situation’s unfolding. So when Michael Lewis talks of luck to the Princeton grads, he reminds them of how important it is to try to work out statistically how the likelihoods were or were not in their favour. I really respect that. I think that understanding how you have come to be where you are can help you understand a faster way to get to where you are going next. This blog post has become such a ramble but I don’t care, it was never for you anyway (sorry if you are actually reading this). In Michael’s talk he says about how we lucky ones need to recognise we have a debt of sorts to the unlucky ones. Because things went our way and could not have. Words that come to mind are karma and momentum. And more luck led to more likelihood of luck and thus more luck ad infinitum.
But for some people it is the exact opposite. I saw a lot of it growing up. Somehow people were swallowed by a thing that eventually can destroy or at least make it very hard to access luck and chances of good stuff happening. For example, you’re 14 and you have a baby, whoops. You’re 15 and have developed an addiction, damn. You’re 16 and got a criminal record already. 17 and homeless, housing benefits don’t exist because they assume you have a home with parents. 18 and exhausted at a crappy job. 19 and unemployed. 20 and depressed. 21 and in a suffocating relationship. These unlucky things can happen incidentally and they all reinforce one another and pile upon each other, I’ve seen it A LOT. Yet, somehow, and here’s where the guilt comes in, I’ve escaped that fate. Due to sheer luck and some egotistical idea that there must be a reason for it so I keep going for these opportunistic things. But most of my successes or avoidance of mistakes has been luck and came from intuitive decision making faculties. Weird. But also humbling because I really feel I have a duty towards the unlucky, particularly those who are ready to improve their lives, who want to. I have been given so much and I feel close to being ready to give back, somehow.
This is the first piece of material I’ve been exposed to from Thoughtworks University 101 prep’ work, imagine what’s in store for me…
Just a little brain dumping from me again, I think this is a good way to process the news that I finally have been made the job offer by Thoughtworks :0 … Obviously my process has been different somewhat to how they normally hire because of the scholarship. On their blog a Thoughtworker Dev describes their typical hiring process – recommend a read if you’d like to work there! I’m so relieved that I can plan now for a whole new future. I’m excited and terrified. Lots of symptoms of imposter syndrome intermittently flooding my brain, but apparently that’s quite common in software development. Anyway this is a complete game changer in my life. A few months ago I didn’t know what I was doing with my life, I was at uni but unhappy and unsure of my direction or even what to do a dissertation on. There were just too many things that interested me and I can’t do everything at once. Also the environment wasn’t right for how I learn. I don’t like to be lectured as a one in an audience of a hundred for 2 hours, it’s just a waste of human energy and time IMO. So I’m very lucky that I applied on a whim and actually got this scholarship from Thoughtworks to learn to code at Makers Academy and so started the start of the rest of my new life. I came from a poor single-parent family with constant moving due to poverty and fighting and the statistically I’m very unlikely to be in any good job let alone one in the best (IMO) and fastest moving industry with an incredible company that seem to good to be true. Let’s say I’m excited, I think it generally summarises my mood well enough.
So I’ve got a month and a half before I start. What to do? Well there are givens such as the Thoughtworks University (TWU) prep work, which involves learning Java amongst some other things. I have a long to-do list and just started reading the bible, Clean Code by Uncle Bob Martin. It’s weird, although I’ve finished Makers I feel like I’ve just started a thing. And it’s true. I never thought I’d say it but I’ve started a career, and the most exciting thing is it’s one that fits me that I chose and that allows me to grow continuously, something I never thought I’d be able to find the fulfilment for.
Me and my cohort at Makers:
Maybe this is the last obstacle before becoming a real software developer. Thoughtworks send me their tech tests, a choice of a few, and now I’m scorning at my ugly code and wondering whether I should have chosen another. Or if I could additionally do another for fun. I can’t publicly tell details of the tests, but let’s say that a couple were on topics that I’ve really never had the opportunity to go into, very theoretical computer science based. So I avoided those even though they were the most interesting, just because I know myself well enough to know that I can waste time easily by researching too much and not leave myself enough time to make the thing work nicely. So I went for a more practical and maybe less beautiful problem just because I knew how to work on it straight away. I’m getting towards the end of it and wondering again what my priorities are. Spend all the time on this? I’d prefer not to. But I do need to do this justice considering the others might not be good enough to submit. First world dilemmas hey. Well the interview will involve going over and extending this code and that seems like the last major hurdle so fingers crossed and back to it!
Return of the mac. It was unavoidable. Makers had lent me the macbook only for the duration of the course and now that had finished and I had to return it. So I did. So although I didn’t touch a computer for the weekend – literally spent 20 hours playing board games instead (bluffing and strategy) – come Monday it was time to configure my Dell Latitude e6220 with a new operating system (OS), one of the Linux distributions.
So the first step, as per usual, is to panic. Go ahead and get it all out. What Linux distribution should I get? What if I screw up the partition? Do I even need to be able to dual boot? But what if I destroy Windows during virtualisation? These were a few of many questions roaring through my mind before I began. I’d heard rumours from blogs that Windows 7 had hardware dependent drivers. I was terrified. So I spent hours researching in fear and then 30 mins to actually do the whole process. Nothing seems to have screwed up and everything is working fine, so I’ll share my steps. For the TL;DR skip to section 5.
1. What is Linux? Why get it?
Linux is a free and open source (FOSS) operating system, whose defining component is the Linux kernel. A kernel is a low-level software that interacts with hardware and does the really complicated stuff (figure 1). The source code is licensed with GPL/copyleft, meaning anyone who uses it in their code must make their code open source too. This has led to a huge rise of many open source Linux OS distributions built on the kernel.
Figure 1. Source Wikipedia Linux Kernel
Advantages of getting Linux include:
– Linux helps you grow as a problem solver due to it’s open source nature and consequent (often necessary) configurability
– Linux has an inspiring FOSS community and how much free code and support for it exists
– setting up Linux will allow you to learn some stuff about computer architecture (drivers etc.)
– being a Linux user will mean you learn to ask the right questions faster, feeling confident that you don’t need to know all the answers, just know what you’re looking for
– Linux is highly stable and most large web servers are running it
– updates and upgrades can happen without rebooting
– full control and ownership: if anything breaks you can go and find it and change it, you don’t need to buy new stuff all the time, all upgrades and new things are FOSS
– it’s great for accessibility
If these sound like things that are important or useful to you, you might want to consider Linux.
- Dual or single boot?
A very important decision to make before getting Linux is whether you want to keep your old OS (eg. Windows or OSX). If you do, you can either run it in a virtual machine such as vmware or keep it natively alongside your Linux OS by partitioning the hard drive. If you do the latter, every time you boot up (turn on or restart), you’ll have a choice of which OS to use. Effectively partitioning means you are sharing the memory in the hard drive between the two OS’. The steps in this blog assume you’re partitioning (for dual boot capability), if not, skip section 8.
- Which distribution?
There are many distributions of Linux OS’. Working out what’s important to you from an operating system is probably the first step. Then you can see the details on Wikipedia’s comparison of Linux distributions. Also bear in mind your hardware’s compatibility (see section 4). In this blog we’ll go with with the latest long term supported (LTS) version of Ubuntu (16.04), as it comes with lots of useful things out of the box.
What to check before beginning.
Before starting it’s a good idea to read around how compatible your hardware is with various distributions of Linux. For example, I found from my manufacturer’s specification that my hardware was certified for Ubuntu. A good idea to start researching is to get the specification for your computer. Normally you can find relevant information on the casing or bottom of laptop. Mine looked like this, you can see how Ubuntu is listed as a supported OS by Dell. If you’re interested in partitioning you’ll also want to check the amount of memory your hard drive has.
Then google keywords (eg. manufacturer, model, type, Linux distribution, partition) and filter the search results to things this year (via search tools>anytime>past year tab). So after reading around commonly encountered issues when installing Linux for your computer, you can take and leave what’s relevant from the steps I followed below.
Also, BACK UP YOUR DATA ON YOUR OLD OPERATING SYSTEM before continuing, just in case.
- Step 1 – get the image of a Linux OS on a bootable drive
Lookup your chosen Linux distribution’s site and download the ISO (image) which is a copy of the whole OS software that you want to be running. There is a lookup for it here. I went with Ubuntu 16.04 and recommend it.
I simply downloaded the .iso and saved it on my desktop and then dropped that into the USB driver I had waiting in My Computer. The USB driver recognises that the ISO wants to make the USB ‘live’. The USB needs at least 2GB and cannot be used with any other files as it’s live. I like to rename the USB something obvious like UBUNTU_ISO. Leave the USB in for the next step. You should have backed up all data from your old OS by now.
- Step 2 – boot with the live drive to install the Linux OS
The next step is to reboot (restart) the computer with the live USB drive in. If it automatically starts Ubuntu and installation options, skip the next step. If it ignores your USB and boots your old OS, read the next step.
- Step 2.5 – change drive boot order in BIOS (may not need to do this, see previous step)
The live USB may have been ignored if your boot order of drivers is configured to always prioritise your old OS. In this case you’ll need to reboot again and this time press f12 or delete key when the option momentarily comes up during the first booting display. You will find yourself in the BIOS. Navigate to where the boot load order is defined and change it so that your live USB, which you named so obviously, is the first to load. Then exit the BIOS, hopefully Ubuntu or whatever Linux distro you use will load, otherwise reboot once more.
- Step 3 – install the Linux OS and choose dual boot
Once you have the installation welcome settings from Ubuntu or [other distro here], just walk through the setup and most crucially look out for any questions about dual boot or partitioning. You’ll want to select that option if you want both operating systems (see section 2). You’ll see how much memory is assigned to each OS. Confirm all the things.
- Step 4 – check everything is working ok
If everything seems fine with your new Linux OS, then reboot and this time select your old OS, say Windows or OSX, to check it still works. You may need to do some extra stuff to get it to work. Like installing other drivers. You may need to install drivers for the Linux OS too. Just read a lot and tackle each problem individually as it comes up, there is lots of support from the community out there.
- Celebrate and check out some cool software and Linux community stuff!
It came so fast. But yep, it’s our last day, our graduation from Makers. We’ll have a careers fair in the morning where employers come to talk about their companies and check us out and then the presentations of our final projects in the afternoon. I’ve got all the normal feelings of fear and excitement for the future, now my structure is self-determined and I can customise my learning 100% but also have to think about outside world things again, like family and finances. I have to return my laptop I was borrowing for the course so first weekend project will be to get Linux on an old one by partitioning the hard drive. Need to choose a distribution. But then there’s a bunch of things I’ve been endlessly listing that I want to do such as continue on the final project we’ve been doing in Swift (Turfy) – you can see the demo here! And finish the TDD linter from another week. And generally clean up my github a bit. Also there is no easy way to mock objects with XCTest, a testing package for Swift, so that could be a useful thing to try and start making. Which reminds me I wanted to add a spy strategy to Jasmine. So I might have finished one adventure but at least now I have lots of things to launch on. And crucially, I feel that I can work on these things and make progress. Before this course I didn’t, I was overwhelmed by my lack of progress whenever I tried to code, so the motivation was lower. Now it’s really high. I want to make robots with Johnny-five node package. I’m so excited to be a dev at Thoughtworks too. And nervous about other people relying on my code haha.
My final project team and me:
Final projects are underway! I can’t believe how fast everything is moving. I’m on a wonderful team with a great project, an iOS app which lets you send drop pins on a map which contain a message to a friend which is pushed to their phone when they walk into the location of the pin. It’s like location based reminders for others. An awesome idea. How many times did you ask your husband to pick up the laundry from the launderette and he forgot? Next time don’t bother, drop a pin and let Turfy (our app) push notification him when he’s walking past! Or what about asking your neighbour to feed your cat, or water your plants, when you’re on holiday – again, location based notifications will remind them at good times when they’re home! So yeah I’m really behind the idea. The tech is all new for me. It’s an iOS app so we needed to choose between Swift or Objective C, we thought the former was less of a jump. But still I’m finding it challenging, since it’s statically typed, you need to have type annotations everywhere so that every input, output, declaration etc. know what data type they expect themselves to be. This means that errors are caught by the compiler so you get totally different kinds of errors to those we’ve been familiar with from interpreted languages, runtime errors. So it’s a bit tricky to understand when my computer science knowledge is lacking. Anyway it’s still a playground we’re kicking sand around in, but things are coming along slowly and our project size is achievable. It’s very exciting to also be using Firebase, a cloud based real time database service developed by Google. It looks like it will service a lot of our applications needs such as user authentication, notifications and real time data updates. There are lots of challenges in this project but I’m glad for them. I’ll sleep now so as to have morning time to brush up on more Swift basics.