Growth Mindset

My wife is a public school teacher, she teaches students who have special needs. She teaches a lot of students with learning disabilities and one thing she focuses with her students on a concept called “Growth Mindset”.

What is Growth Mindset vs Fixed Mindset?

The concept is there are two mindsets in people in learning and life. Growth vs Fixed Mindset. Growth says, I don’t know right now. Where as fixed says I will never know. Fixed mindset says nothing will change, that I can’t, I won’t and I’ll never. Whereas Growth Mindset says: right now, I can’t, but I will. Even though I’m frustrated, I will keep trying.

What is the number one factor in success?

If you look across the dozens of highly successful people, they all took action. They pushed themselves and they changed the world. Bill Gates, Steve Jobs, Elon Musk (Tesla, Solar City, Paypal) and others like JD Rockefeller, or Henry Ford.

If you read about Henry Ford and the Ford Motor company, Ford was born out of the experiments and side projects of an engineer. He “played” with gas engines, he had many successes and failures. But what is clear, it’s the act of trying, of pushing yourself and doing that is a better determining factor rather then intelligence alone.

How can I apply growth mindset to my career?

What areas do you lack or struggle in? Do you suck at or hate office politics? So do I, that’s why I’m reading Harvard Business review on politics. That’s why I tutor on the side, thats why I am learning Elixir. What are my gaps in my own knowledge? We, functional programming and distributed systems.

How can I apply growth mindset to my life?

It starts with an attitude or a world view change: I can, I am able, I’m going to keep trying. It’s just like practicing an instrument. You’re working at getting better. I applied growth mindset to the first 10 times I went skiing. Every time I fell down I laughed, cussed and got backup and gave it another try. Now, I can ski almost all day without falling over, I can do a mixture of blues and blacks. I push myself and if I fail, I don’t give up.

Photo by Jessica Ottewell via Flickr

Private Data in Javascript

One of the things that I feel is really missing from the JavaScript programming language is the option of private data and private behavior (methods) to an object. I never could get data that an outside caller couldn’t see. That is until I discovered the JavaScript closure.

A closure is typically a function. You can control scope, by returning an object containing data and public instances. What does one look like?

(function(){

})();

On line 1, we declare an anonymous function and on line 3, we end it and then immediately invoke it. We don’t return any data, we return undefined by default. What’s interesting is that you can pass arguments so that the variables that you use within the scope are local:

(function($,_){

})($, _);

As you can see we’re now passing in a jQuery block and an underscore block, no longer do they have to be globals.

To expose data you can return specific data or an object:

(function($,_){
var myPrivateData = “randomSocialSecurityNumber”;

return {
time: Date.now(),
socialSecurityNumber: myPrivateData
}
})($,_);

Here’s a full example with public and private data:

var App = window.App; // get a global
var id = submissionID;

var payRoll = (function($,_, App, id){
var user = App.collection.model(id);
var timeSheet = App.collection.timeSheets.model({userid: id});

var grossPay = (function(timesheet){
return timesheet.rate * timesheet.hours;
})(timeSheet);

var takeHomeRate = (function(user){
return 1 – user.taxRate;
})(user);

return {
hourlyRate: timeSheet.rate,
hoursWorked: timeSheet.hours,
grossPay: grossPay,
netPay: grossPay * takeHomeRate,
id: user.id,
firstName: user.firstName,
lastName: user.lastName,
};

})($, _, App, id);

So for our payroll object, if we wanted to access the takeHomeRate, we can’t because it’s completely private. We can’t say payRoll.takeHomeRate. But we can say payRoll.grossPay, because it is data we expose by returning it. If we don’t return it, won’t be public. Which means that now we can have an assortment of private attributes to an object that has no exposure, creating a contract by which you can modify the internal structure of JavaScript objects without changing the contract and breaking future users.

Photo by RestrictedData via Flickr

Scrum is the new waterfall (REVISED)

Over the last few months, I’ve gotten a TON of feedback from my post in November, “Scrum is the new waterfall”. Some of the feedback was good and others really thought my perspective is extremely negative.

After reading all the feedback and considering it, my arguments were not concrete enough to make a strong case for my strong opinion. One of the things I learned is that scrum is done very differently across different companies.

Lets revise my post.

What are the main problems with adopting any new processes? 

  1. No buy in from leadership. I’ve worked on several projects in the last 2 years at my company now where the “business” or leadership team don’t buy into the belief that doing things iterative in an organized fashion will produce better software. Buy in & support from whoever is paying you is the first key to being successful in implementing whatever new process you’re adopting.
  2. There is no buy in from the team. Recently I worked with a team that didn’t want to change. They were used to the crazy and old way, the mid night deploys and code constantly breaking. Without team member and leader buy in, there will be no progress in making forward change.
  3. The perceived need isn’t there. Things work well, we ship code and make money, why are people complaining? Sure it might not be ideal, but hey, nothing is ever ideal.

What is scrum? 

Scrum is a process. It’s a way to get work done. There are iterations to deliver software to the customer very quickly. From my perspective the value of scrum to the business and leadership is predictability. Within a reasonable perspective, we can estimate that we can deliver x software in y amount of time. While that sounds great and reasonable, often that is not the case.

What is the motivation of scrum?

From the Scrum Alliance we get the following definition of scrum:

Scrum is a simple yet incredibly powerful set of principles and practices that help teams deliver products in short cycles, enabling fast feedback, continual improvement, and rapid adaptation to change.

How can scrum become waterfall? 

Scrum can become watefall-y in certain situations. Such as:

  1. The ceremonies are more important then the work getting done. This is especially important when Standup serves as a status meeting to notify and justify management that the developer team is getting work done. Standups aren’t for management to get a status update, thats what the Kanban is for, the standup is to help move the team along.
    1. Other ceremonies such as planning and grooming, while important, if it drags to many engineers away it can make the process burdensome.
    2. There should be a natural balance between how many meetings and the effectiveness of those meetings and the ability to move the team forward.
  2. “It’s just a small change”. This is really important, Scrum is about delivering working software on a schedule. When someone comes to you asking you to deliver work outside of the scope of the sprint, you need to push back to your scrum master and team. Small changes can quickly become big headaches for teams.

The core problem I have with Scrum is it feels “Anti Agile” but in the cloak and dagger of actually being Agile. The key parts of this argument come from the Agile manifesto itself:

Individuals and interactions over processes and tools
Working software over comprehensive documentation
Customer collaboration over contract negotiation
Responding to change over following a plan

The key points are, can you prioritize people and the interactions instead of the processes? Can you respond to change really fast? Can you deliver real working software?

How do I actually be Agile?

It’s my belief that there are several components both technical and philosophical to actually being Agile.

  1. Philosophical:
    1. Ensure that the leadership and team have by into delivering software that’s high quality really fast. It’s better to keep delivering software small chunks at time so that you can quickly get feedback.
    2. Focus on communicating the needs that are changing and prioritize the team to work smart and solve the most important “Minimum Viable Produce” path first, then iterate on the second things that need to change.
    3. Get the client onboard, get them to be apart of the feedback cycle, and deliver real software on a continual basis.
  2. Technical:
    1. Write clean, testable code.
    2. Configure your build process to catch bugs by running tests, automate deployments to QA / STAGE and create an approval process that automates the deployment to production.
    3. Create automated “Black Box” style tests that utilize the behavior of the code you’re testing. Think about the public contracts it must enforce, test strictly those. Unit tests are worthless, test the contracts.

Photo by Tony Fischer

Live and die by the keyboard: How to be more productive!

I live and die by the keyboard. The keyboard is my friend and it’s way faster to use an application using a keyboard then it is to use a mouse. In fact there are many studies that show that for non-complex key combinations keyboard shortcuts and aliases are much faster then using the mouse. Continue reading Live and die by the keyboard: How to be more productive!

Improve professional communication

As software engineers we communicate far more then most people expect. We constantly communicate wether we write code, talk at standups or respond to emails. Professional communication is essential. Something that I have been working on for myself is improving my professional communication.

In general here are some specific areas as engineers that we can improve in the way we communicate:

Continue reading Improve professional communication

How to launch Sublime 3 from the command line (Mac OS X)

I’m an avid Sublime user. It’s the VIM of the 21st centry. I also constantly use the command line. The two can be one, even though Sublime is a GUI driven application and not a CLI application. One of the most helpful things when working with the command line and needing to open up an editor is to call Sublime from the command line followed by the file or folder name.

To do this, if you’re on a mac use the following link:

ln -s “/Applications/Sublime Text.app/Contents/SharedSupport/bin/subl” /usr/local/bin/subl

Then from the command line you can do the following to open something in Sublime.

subl test.html

I tested this in Sublime 3 using both Bash and ZSH.

Photo by Matthew Simantov via Flickr

URLs and the browser

I love working with the web, there is so much to know and learn about web development. Have you ever thought about the URL? I recently learned quite a bit about the URL. The URL is composed primarily of a few things:

  1. The Scheme, which is followed by the “://”. This is typically http, https or ftp. Others such as file:// are also valid.
  2. You can also supply user name and password “user:password@”
  3. There is the host:port, which could be something like localhost:3000
  4. Then we have the path, such as /api/v1/news_feed
  5. Finally we have the query parameter, such as ?id=5&name=”adam”.
  6. The fragment identifier is the “#” in the URL. This is client side only and is not sent to the server. The fragment can be used for client routing or for client specific behavior or specifically to link to a certain location in a document.
  7. All of 1 – 5 are sent to the server. List item 6 is not sent to the server.

#6 is really interesting and new to me. I’ve never thought about a URL having two componets, client side and server side. It’s really cleaver and genius. What this raises is issues with a SPA framework however. The whole issue comes down to client vs server behavior, the “clean”, “marketing friendly” urls that don’t rely on the hash tag are always sent to the server. This is why you need mod-rewrite rules in apache. Everytime you navigate in a SPA, all of the url before the fragment identifier is sent to the server. The server has to ignore all the of these client specific urls. This adds a lot of complexitity and unneeded overhead in dealing with your SPA application. A better approach is for server invoked behavior, use the part of the URI before the fragement identifier, and for the client specific behavior, use the space after the fragment identifier.

Resources:

Photo by ~My aim is true~ via Flickr

Start a blog!

While I don’t blog the most consistently, certainly the holidays didn’t help. I have recently discovered that I really like writing, getting to express myself in the written form has been liberating. Listening to a guy like the Simple Programmer has inspired me to think of what I could do with my career through my blog. I could start my own training program for new programmers, I could tutor more and I could even speak at a conference. Honing my skills and grammar will allow me to write a book “some day soon”.

I encourage everyone to start a blog, even if your writing sucks. Blogging is fun, its engaging and challenging. You have to express your ideas clearly and articulate yourself. Give it a try today!

Photo by Joel Montes de Oca via Flickr

Where do you get these great photos?

I am a big fan of the photos that are the “featured” image on my blog. They’re really great. I’ve found a ton of photos from Flickr, they have professional photos that are high quality. The search engine I use to find these is the Creative Commons Search. Its really cool because it allows you to search for free photos for commercial use and readapt. I give credit to the creator of each photo I use.

Photo by Adam Bourg, Screen Shot via his Macbook pro.