In Agile and outside of software development there is an idea that people have shapes. These shapes refer to the specialties of users in technologies or other practices. There are plenty of studies and other articles about the general shapes of people and how to build teams with these people.
At a high level here are some of the most common shapes
Dash – General knowledge of many things to no expertise
T – A Good spread of general knowledge and one specialty
E – Someone that has experience and can execute plans
I – No general knowledge but has specialty
But for this post, I am not interested in the basic shapes. I want to delve into what shapes come about in a mob programming environment. What shapes come out when working in a highly collaborative team where all knowledge and tasks are shared.
From my experience, the basic letter and symbol shapes do not match up when mob programming. People are no longer specializing solely in one area. In my organization, every member of the mob touches every piece of the code from the front to the back end. This includes testing, security, deployment, and in some cases even UI design.
We are no longer looking at a team where one architect creates the overall design that the team follows. There is no longer a QA member doing all the end to end testing. There is no concept of throwing pieces over the wall letting the next person take over.
Let’s assume everyone joins a mob and starts as a T shaped member. Everyone has a general knowledge but one person is an expert in testing, one person is an expert in the technicalities, and another is an expert in design. As these members work together their knowledge is shared and transferred among them.
What I believe happens on a mob is the original T shapes expand. The single point of knowledge expands into the other areas that each other team member is an expert of. The T’s expand to become Trapezoids, specifically upside down trapezoids.
The team members keep their original breath of general knowledge but their specialties expand. In time they are all experts in testing, the technology, design, and all other aspects of the project. Everyone on the team has become more versatile because of the collaborative environment. They no longer need to rely on a single person because of their specialty.
Everyone is able to succeed and excel in the work they do no matter the task at hand. This is all created because of mob programming.
Just recently I put my first app into the Android Play Store, Motorcycle Riding Weather. A 2018 goal of mine was to release a mobile app, and I have achieved that! It is a simple app where users manipulate settings to determine if the upcoming days will be good for riding their motorcycle.
I released the app as an MVP (Minimum Viable Product). It is barebones for right now. I plan is to continuously improve the app with more features and more riding settings to configure.
It was a fun experience putting together the MVP. I have taken some shortcuts in the code in places, and have a little bit of messy hard to extend the code. This gives me plenty of work to do in the coming months. But I released, I have something that provides value to users even in its most basic state.
The app is 100% developed using Xamarin.Forms. I have only released the app on the Android Play Store for right now because that is the only app market I have paid to be on. Android’s $25 lifetime developer access is much more affordable to me compared to iOS’s $100 a year. Technically, my app works on iOS but I cannot see myself paying $100 a year right now.
Along with Xamarin.Forms I am using Prism 7 framework and .Net Standard 2.0. I had not had much experience with these latest versions. The features they provide make development more streamlined.
The Dark Sky API is what I use to all weather data. It has a free tier with plenty of API calls for my current needs. I found it to provide the right balance between up to date information and free API calls available.
Plans for improvement
Plenty of things need improving but a list that will change over time is below:
Add more configurable settings: Wind, Rain type, Snowfall, etc..
Ability to not consider certain timeframes in the riding conditions such as nighttime
Allow for more than just zip code to determine the location
Write Unit Test and UI Tests
Abstract out services instead of doing lots of work in view models.
Incorporate more analytics events
Check out Motorcycle Riding Weather in the Play Store now! I look forward to posting my progress on the app as I release updates.
I support the software development strategy of make it work, make it right, make it fast. This is a quote from Kent Beck, common in the software industry. I interpret this quote as, let us make sure our most basic solution solves the problem at hand before investing any more time than necessary.
Make it work
Not all solutions to a problem are pretty. This may mean little to no tests, poor performance, janky code, etc. Sometimes we just need a solution to a problem that shows that the problem can be solved. We want to make sure the problem is solvable albeit with a less than desirable solution.
An example where I implement a ‘make it work’ solution in code, is often in the area of user input or user navigation in my applications. Instead of relying on the user, I will hard-code the exact data I want. I want to encourage the happy path solution and test my application under only the best case scenario. This will tell me if under the most ideal conditions whether or not my solution even works. If my code does not work for this, the solution will have no hope in the edge cases and no reason to continue on with the work. I would then focus my ‘make it work’ code on implementing a different solution until I get it right.
Pushing code to production in the ‘make it work’ phase is a scary thought and something we should all strive to avoid. If you have a continuous integration (CI machine running all your tests pushing this ‘Make it work’ code is an option (preferably in a separate branch). However, it is important to see how it holds up to a full suite of tests.
Make it right
If we can show the problem can be solved with a ‘make it work’ solution we can move onto steps to make it right. This includes tests, proper syntax, good naming conventions, extensibility, and the like.
We want to remove any hard-coded data, we want to start thinking about the edge cases, and we definitely need to have tests around the code. For testing make sure to comment out code or remove code to see a failing test. Never trust a test during this stage unless you see it failing first for the right reason.
Our code should be bulletproof at the end of the ‘make it right’ stage. We should not feel any hesitations about presenting this code to a user from the standpoint of introducing a bug. A ‘make it right’ solution should be production ready.
Make it fast
Now for the hard part, ‘make it fast’. This is an area of software development that we often do not get the time and resources to experiment with. We just released a solution to production that works from the ‘make it right’ stage. It adds value to the users but we have ideas of making it even better. Often, the next bug or feature takes priority.
But let us assume we have the time. Let us assume we have the resources. We should always be thinking of ways to refactor our code and continuously improve the solutions we have.
Make it fast sounds like a performance or timing centric idea. People think “how can I get this code to run faster”. But it is more than that. We should be thinking how can I make it more testable, how can I make it more extensible, how can I make this code more valuable to the user. Performance is important but these other areas are just as important as well.
Having time for the ‘make it fast’ stage is a privilege and we should always try to take advantage of it. Improving existing code is just as important as writing new code.
In the end, we want to provide software solutions to our users that provide the most value. The make it work, make it right, make it fast idea of software development can help us get there. It allows us to choose the happy path of problem-solving before even considering the often much more difficult edge cases. Make it work, make it right, make it fast provides a solid foundation for building great code.
Make it work, make it fast, make it right -Kent Beck
I was already familiar with the Azure cognitive services but never heard of the bot service. This talk was eye-opening. It has gotten me even more enthusiastic about using bots and cognitive services together.
My favorite part of the talk was using bots. It showed how setting up a simple bot could be done in minutes. I have a bot I’m working on now and plan to add in text analysis for even more Azure power.
With the following tutorial Create a bot with bot service, you can have your very own chatbot set up in minutes. This simple tutorial opens many possibilities for automation of customer interactions, providing better support, and overall better online experiences.
I encourage you to make your own bot, a lot is possible even with the free payment tiers on Azure. And I will share my further exploration of bots and cognitive services.
Azure Machine Learning Studio
Machine learning has become a popular topic. It has been something that I have always wanted to learn more about. I was excited to attend this session and learned a lot from James McCaffrey.
This session was an introduction to using Azure Machine Learning Studio but nothing on the technicalities of machine learning. We used the platform to analyze Iris flower data. By using various measurements of the Iris flowers, we could predict the species variety.
Unfortunately, all the technical aspects were glossed over but the power of the engine was shown. With existing data, and knowledge of machine learning settings, one can start doing analysis in less than an hour.
I hope to, in the coming months get a better understanding of the machine learning details. Get to understand and use the true power of Azure Machine Learning Studio.
There was plenty of other great content provided at Visual Studio Live 2018 in Las Vegas. I am bringing back knowledge to my team and my students. Visual Studio Live is a conference I want to attend again.
I have been so busy with the teaching job that I have not had time to dedicate to this blog. Hopefully the teaching gets easier and cools down soon. It should now that the semester is just about done and there is not too much left in lesson plan prep.
But enough about me, here is What is going right: Mob Programming Benefits (Part 4). I will give a short explanation on the two benefits below highlighting the great parts of Mob Programming. Check out the other parts of the series for even more benefits of mob programming and expect more posts in the future.
Divide and Conquer
Divide and Conquer
I am on a small three person mob working with a technology that none of us have had prior experience in outside of our current project. This means we run into situations that no one knows the answer to. How do we solve these complex problems? Well rather than squander around the code all together often we take a Divide and Conquer approach.
By divide and conquer, I mean that we will all split up and begin researching/attempting solutions/poking around the code all on our own. This may sound a lot more like traditional programming where everyone is by themselves working through problems and it kind of is.
The mob programming aspect comes into play whenever anyone finds a good example/article/forum post related to our issue. We share the findings and discuss them together immediately. Maybe the new knowledge helps connect the dots with what someone else was already reading or thinking about. Maybe the team decides that it does not relate, so we do not waste anymore time looking at it.
We take a divide and conquer approach but share all the knowledge along the way and get more research done while still keeping everyone informed.
In software, it can be easy to take the easy path instead of the harder but infinitely better path. When writing software you may think “Oh this will not be my problem in the future” or “I don’t need to test this feature it will never break”.
In my mob we hold each other accountable and ensure that we are not skimping just to make things easier for ourselves. I will relate this to testing because its an easy target. We test EVERYTHING. No matter how small we make sure to right a test first. Sometimes one of use will get an inkling that maybe we can skip the test on this one. Or we just straight up forget to write the test.
Having the mob, we always have someone to reign us all back in and remind us of the software practices we need in order to maintain quality. As a mob we are all accountable for one another and we use this to ensure we are always writing the best software.
That concludes What is Going Right: Mob Programming Benefits (Part 3), check out the other posts in the series.
Here is What is going right: Mob Programming Benefits (Part 3). I will give a short explanation on the two benefits below. Check out the other parts of the series for even more benefits of mob programming.
Temporarily joining another mob
Temporarily joining another mob
Yesterday I found myself alone at my mobbing station. We are not allowed to write production software without at least one other person mobbing with us. So, I rolled my chair over to the closest mob got my name in the rotation and began mobbing with them.
The mob I joined was in a language I have very little experience with and a technology stack I have even less experience with. But I was able to follow along and contributed what I could.
I was mob programming with the team for roughly 45 minutes before we broke out for lunch. During this time I was absorbed into the new mob. It was an easy transition into the other mob. It did not cause disruption in the flow of the mob. And I got to learn more about the technology our teams are using.
Mob programming let me join an entirely different team and share my skills even if just for a short period of time.
When you have a group of 3 or more people all working on the same project at the same time together knowledge is going to be spread. Mob programming reduces knowledge silos essentially to zero. If someone is already very knowledgeable on a subject while the rest are not, the knowledgeable member navigates the others so the knowledge can be shared. Knowledge silos do not last long if they exist at all.
A second major benefit of redundant knowledge is that members can leave. For something as common as getting coffee or water, when a member leaves, the code is still moving forward. And even more importantly if a member goes on vacation all the code keeps on going. We do not run into roadblocks because of the redundant knowledge.
Redundant knowledge means 100% participation by every member of the mob at all times is not necessary. People can come and go as they please without worry.
That concludes What is Going Right: Mob Programming Benefits (Part 3), check out the other posts in the series
I am always interested and looking for new libraries to put to use in Xamarin.Forms. I recently stumbled upon Microsoft Cognitive Services Emotion API and wanted to see what it was all about. After a quick look at some sample code, I knew I needed to sign up and try this library out for myself.
According to comments in the code, which I am always skeptical of, the API can detect happiness, sadness, anger, fear, contempt, disgust, and neutral. It is amazing that it can determine these emotions and with great accuracy. What is even more amazing is that it basically is one line of code.
This one simple line gets the first (highest percentile) emotion recognized from a picture. Using the sample code you can easily take a beautiful selfie, send it with the single API call, and within seconds get an emotion back. I am not sure yet what factors cause it to take longer but sometimes I get results back in under a second.
From my dozen or so attempts at taking a picture of myself, it gave quite accurate results. I have yet to fake fear in a picture but will see if I can one to happen. I am very impressed with the Emotion API’s ability to analyze and image and produce an emotion result. Looking forward to Microsoft adding even more emotions.
The free tier for using the API is quite impressive in terms of the number of calls available. I hope to be writing a post soon showing off an app I have made in Xamarin.Forms incorporating the emotion API.
I have been in the mob for over a year and have more aspects of mob programming that I would like to share. Let’s jump right into What is going right: Mob Programming Benefits (Part 2).
Idea Generation & Development
Efficient use of time
Idea Generation & Development
Mob programming promotes the generation and development of ideas. You have multiple team members to bounce your ideas off of in order to come up the best solution. You do not need to come up with entire solutions on your own or have a fully thought out idea.
I have found myself presenting a half-baked idea, knowing that with the help of my team members we can work the idea into something real. It is a great feeling to be able to present just half of an idea and get input from the team on how to build it out to fruition.
This also helps in the opposite direction. If I present an idea not fully thought out and a team member can point out the flaws; I do not have to waste any more time trying to build the idea when in the end it would not even work anyway.
It is hard trying to take an abstract concept in your head and code it up into a full solution all on your own. But with mob programming, you have the help of your team the whole way.
Efficient Use of Time
Mob programming makes efficient use of the developers time. My mob only has one, yes ONE, regularly scheduled meeting a week. And even better only one mob member has to attend so the three of us on my mob rotate. I go to one regularly scheduled meeting every 3 weeks.
The rest of my time is spent coding. If my mob decides we should discuss a topic more in depth before jumping into code we do not schedule a meeting and find a conference room away from our computer to discuss. We simply swivel our chairs to the whiteboard or just start talking.
On a good mob, impromptu discussion just happens when it needs to. If the code is flowing fast then no need to discuss, if we are up against a challenge start discussing.
Mob programming lets you focus on the code, which is exactly what every developer wants to do!
This blog has turned into more of a technical spot recently; however, it started as a place for me to share my favorite memories. This post will be about my 5-day backpacking trip with an amazing group of friends on the Lost Coast Trail in Northern California King Range National Conservation Area. It is a memory I will never forget and want to share.
Day 1 on The Lost Coast Trail
The first day on the trail started with the group getting some last minute items into our packs in the parking lot of Black Sand Beach trailhead. We were taking the North to South approach to the trail, leaving our cars in Black Sands, and having a shuttle take us to the north end, then hiking down from there.
After a bumpy and windy bus ride to Mattole Beach trailhead, we eagerly threw our packs on our backs and headed to the trail. The trail started out sandy, very sandy. But hey, we knew what we were getting into. The goal for the first day was to get in a few miles nothing strenuous, we wanted an easy introduction to the trail and since we were planning to take 5 days to do 25 miles, we were in no rush.
We were all excited and all full of adrenaline starting out our first day on a camping trip that we had all been looking forward to for months. We easily made it to the major landmark Punta Gorda lighthouse. It was constructed in the early 1900’s to help alert ships of the treacherous tides along the coast and saw service until the 1950’s. We were now the ones taking on the treacherous coast.
Just a half mile past the lighthouse we came across a creek and some camping spots that we decided to stop at and make camp for the first night. The first day of the Lost Coast Trail was an easy one with mostly sand and some hard packed dirt. In all our excitement the sand really did not bother us at all and at this point, we really did not know how precious the hard packed dirt could really be.
The wind was strong on our first day, Fortunately, our camping spot provided some cover but still we experienced a windy night. We half expected to wake up without a tent fly anymore. It really was that strong of wind. Luckily, all our stakes held and the rainfly clips held strong, thanks REI Half Dome 2!
Starting the amazing Lost Coast Trail and all the excitement and adrenaline that came with it
Exploring and playing around the Punta Gorda Lighthouse
Having to have someone hold tent down as we set it up because it was so windy
Having our first campfire on the trail
Day 2 On The Lost Coast Trail
Our second day started off lazy. This day we would be dealing with a tidal zone and low tide was not until 4 in the afternoon. We wanted a noon start so lazily ate breakfast and packed up in the morning. After leaving camp we had a mile to get to the tidal zone and 4 or so miles of the tidal zone to deal with. The tidal zones were exciting for all of us since we did not entirely know what to expect other than the fact that we would basically be face to face with the ocean for most of our hike.
What we did not know or expect were the number of rocks we would be hiking over. We were able to keep hiking at a decent pace but the fear of ankle injuries was definitely in our minds. 4 miles of hiking on rocks meant secure footing was a necessity, full hiking boots a must.
After some scrambling across the rocks, we came to a spot where even during low tide it looked dangerous. This was about a mile into the tidal zone and during low tide, it still looked impossible. We scoped out the area and some knowledgeable hikers came by as well. They informed us this spot would require going up on the bluffs and hiking a half mile or so, then go back down to the beach. Glad we ran into them because going around the point with waves crashing into it would have been a bad idea.
It was quite amazing how one second you are in a zone where the high tide would wash you away and just 50 feet ahead you are back on the bluffs safe from the crashing waves. We made it to the Spanish Flats outside the tidal zone! We hiked another mile and a half to where we would set up camp for the night. Our camping spot for the second night was even better than the first. Well established, very protected, and beautiful views.
First thing first though after getting to camp we all took a bath. We made our way to a spot in the creek where a small pool formed and washed off our dirt and grime. A cold but refreshing bath in the middle of the trail. After a refreshing dip in the creek, we settled into camp making dinner and starting a fire. Some of us stayed up to see the sunset. It was serene being able to sit in solitude on the beach and watch the sun dip down below the horizon. It really felt like we had the entire coast to ourselves.
Hiking along the bluffs, super windy and on the cliff edge
Stepping foot in the tidal zone and realizing damn this trail is intense with nothing but rocks in sight
Making it out of the tidal zone and onto the grassy Spanish Flats, was a relief to be on some solid ground
Sitting by myself on the bluffs watching the waves and soaking in the gracefulcxenvironment
Resting around the camping enjoying the beautiful sunset
Day 3 On The Lost Coast Trail
We had been seeing nothing but the sun since starting our trip but this morning brought on the new weather, fog. The fog was enjoyable, it was a good break from the constant inescapable sun we had been experiencing.
For this day of hiking, there were no tide zones to deal with. We headed out in the morning with the goal of camping just before the next treacherous tidal zone. Without too much sand to deal with we made good time. It was great hiking along grassy bluffs with a mysterious foggy haze over top of us.
A few drops of rain here and there were all we had to deal with while on the trail. Once we got to camp the rain began falling a little heavier. After a somewhat rushed dinner, we jumped into our tents to escape the rain. The rain really was not bad at all but after 3 days of hiking we enjoyed the early bedtime and pitter patter of rain as we fell asleep.
Hiking along the grassy bluff, seeing the grass wave in the wind.
Freaking out a little bit coming across a large group of people performing silent meditation.
Seeing a dead whale on the beach.
Hiking in solitude really experiencing and enjoying the Lost Coast.
Day 4 On The Lost Coast Trail
We awoke to a wet morning. It had not rained hard during the night but a constant drizzle overnight can really get things wet. We packed up our wet gear and made a run for it on the trail.
Today was our another long stretch of the tidal zone that we would be dealing with. Another 4 miles of tidal zone. Upon reaching the tidal zone we were a bit nervous. The rain storm was still occurring and we had shown up only an hour after peak high tide. We could see waves crashing up and taking up the whole beach in front of us.
After waiting half an hour hoping the tides would subside, which they did but only very little. We decided now or never and set out. There were some wave dodging and rock scrambling, but the whole group made it through. The waves crashing so close upped our adrenaline and excitement for sure.
By mid-afternoon the sun had broken through the storm. We made camp just outside the tidal zone at Gitchell Creek. Our last day on the Lost Coast Trail gave us with the best sunset. The lingering clouds and haze looming over the mountains while seeing perfect blue skies over the ocean made for the most magnificent sunset.
Maneuvering through the tidal zone attempting to stay as dry as possible.
Watching the best sunset of the trip, sitting just above the shore break with all my friends
Enjoying the camping area with other campers
Day 5 On The Lost Coast Trail
Our last day on the Lost Coast trail. We took our time packing up because none of us wanted to leave. The 5-day trip had taken its toll on us but still, we were not ready for it to end.
We could see Shelter Cove and Black Sands Beach in the distance. The trail there was not an easy one though. It was all soft sand or tiny rocks that you sank into. It made for a slow pace but we were okay with that.
Upon arriving at the cars we collapsed. Tired, smelly, and hungry for anything other than freeze dried food. We made it! We conquered the Lost Coast Trail.
This was a trip that we will never forget. Are you a backpacker? Then taking the Lost Coast Trail needs to be high up on your list of places to go. If you plan on doing the trail or have already done it yourself, comment below with any questions, concerns, or favorite memories.