Thursday, December 29, 2016

Separate Your Ideas From Yourself.

Lightbulb

We all think that we are full of amazing ideas, and then we try to share them we are often met with a lot more resistance than anticipated.  If you tie your own identity in with your idea, this resistance will feel like a personal attack.  If one feels personally attacked, they will be much less likely to suggest any further ideas no matter how good they are.

There are two ways this can be rectified.  One, get everyone who you share ideas with to put on the kid gloves and soft talk you.  Two, separate yourself from your ideas.  In reality, you can't control anyone else so there really is only one option.  You have control over how you view things so you'll need to fix your own mindset.  You can also set an example of not being an extremely harsh critic of the ideas of others and hope that others pick up on that.  Still, you are only in control of yourself.

"Separate yourself from your ideas and your work and see them as something separate from yourself, you’ll feel you truly have the right to be wrong. If an idea fails, why not let it be the idea’s fault instead of your own? Allow your ideas to fail without turning them into personal defeat. When you fail you discover your boundaries. You map out the edges of your capabilities. And this allows you to eventually move beyond them. Being wrong eventually leads to being right. And even where it doesn’t, it’s still a more interesting path than being nothing."
-Steve Pavlina

If you tie your sense of self to your ideas you will grow attached to these "brain babies" and we nurture our little brain babies and give them names and help them grow.  Then we introduce our brain babies to the world and people tell you that it's a stupid name and that it's ugly and smells bad.  If you're overly attached, you will take that criticism very personally.

If you separate yourself from your idea, you can let the idea be open to improvement.  You can also use it as a learning opportunity.  Most likely the criticism is based on knowledge that you were unaware of.  These unknowns are exactly what you need to actually reach the goal you desire to achieve.  Use this discussion as a way of learning the things that don't work.  Treat your ideas like Edison's attempts at the light bulb.
"I have not failed. I've just found 10,000 ways that won't work."
-Thomas Edison

There are of course people that are just plain negative and resistant to change or even people who don't think that any idea they didn't come up with is useful.  That is a whole different post, but most people are not in those categories so just keep on going and don't bind your sense of self to your ideas to closely.

Here's the thing, it's an idea, not a reflection of your worth.  If you had a good idea, you are not a good person and if you had a bad idea you are not a bad person.

Here's a good article on a similar note from Forbes.com

Tuesday, December 27, 2016

You Should Always Be Refactoring

Refactor stickers

So as part of my quest to read the "Classics" of software development  I've found at least one common thread.  It is that you should always be refactoring, but it's not the same definition of refactoring I would have thought of previously.

I had always thought of refactoring as trying to improve existing code, but that doesn't need to be the case.  You can and frankly should refactor the code you are writing right now.  Now, I've done code cleanup all along, but usually, it'd be something I'd do if I had enough time because I finished functionality early.  Now, I'm going to make refactoring a priority and allocate time for it up front.

Obviously, you're always trying to write the cleanest code you can, but one can't put the thought into perfect naming and optimal logic on the first try.  Coding is often about getting the ideas out of your head as a stream, so you can't stop the stream to optimize.  However, once you've completed that flurry of creation you need to step back and do the touch-up work.

I believe that before you check your code in, you should stop and give yourself a code review.  First take a break to clear your mind. Then, take a step back and really try to check everything with an objective eye.  Try to tear it apart to make sure the naming is obvious, the logic is sound and that the needed tests are in place.  Does it follow the DRY principle, are the edge cases covered, will a 19-year-old intern be able to understand what it's doing 6 months from now?  Then repeat the whole thing again until you are sure you've removed all the code smells you know how to find.

While you are refactoring your new work you should also make sure you are following the Boy Scout Rule on any existing code you work with.

Now, here's where things get interesting.  You can refactor parts of your life outside of software development.  You name it, sleep, diet, exercise, career, interactions with family or co-workers.  You can take a step back and evaluate what your goals/expectations are and check that your habits are set up to achieve them.  If not, you can begin to make incremental changes, but just as in software it will work best if you have test coverage.

With New Years resolution season coming up, this might be a good time to work on some life refactoring.  This is where refactoring can really shine.  Instead of deciding that January 2 you are going to do a "rewrite" to  "change all the things", pick out a small change and test it out.  If it works, do another small refactor and so on.  You are likely going to have better success with refactoring than with a rewrite.

If you do a "rewrite", where you try to do a complete change of everything all at once, most likely it won't be successful and you'll end up going back to the original program (with no improvements and with a bitter taste of failure), but if you make changes incrementally you'll find out what you can and can't change and have an understanding of why.




Friday, December 16, 2016

"I Wasn't Trying" Doesn't Fool Anyone but Yourself

Lackadaisical

One method that people have for protecting their ego is to never give full effort to things in life and hope that half effort is good enough.  They do this to have a built in excuse for failing.  It seems like a  low-risk proposition to go with mediocre intensity and just see how things work out.  However, it is anything but low-risk, it's almost guaranteed failure.

I have been guilty of this myself.  I have been a terrible slacker at many things that I have done. So I can come to you from a place of experience.  Nobody is buying it!  You may be able to protect your ego by saying "I wasn't even trying", but the result is the same you are putting out crappy results.  To the outside world, you are putting out bad results, the reasons why are not important.

You may save your ego, but you will lose the respect of those around you.  That's why I say nobody is buying it.  You are seen as unreliable and incapable.  People might give you the "you need to apply yourself" line, but what you really need is a firm kick in the pants (hopefully from yourself).  I don't care if you are better than most everyone else, working at 50% an experienced eye will know the difference between coasting and hustling.

Many of us don't want to deal with the true feeling of failure that will come over us if we give something everything we have and fail.  You will only end up with a feeling of regret,  even through all the bull you give yourself about how you could have been awesome if you really tried.  You'll say it doesn't matter to you anyway, but you'll know that's a lie.

Trying hard and failing sucks.  It proves to you and the world that you have been weighed and measured and found lacking.  However, you actually have a baseline for what you can accomplish if you give it everything you've got.  That gives you a true measuring stick of where you truly are right now.  With that, you can truly focus on what you can do and what you need to improve on.  Without it, it's all theoretical.  You can't know your true capabilities until you've pushed right up to and possibly beyond failure.

Most of all, going full tilt into something and succeeding is where the magic lies.  You'll have no regrets of things left undone or untapped potential.  You'll have the accomplishment of knowing that you did everything you could.  At this point what you've accomplished truly belongs to you. That is a great feeling.

Perhaps the great philosopher Yoda said it best "Do or do not, there is no try".


Goal of Reading the "Classics" of Software Development

classics

Now, I'm a developer that tries to stay somewhat up to date by listening to podcasts, keeping up on Twitter and reading blog posts, but this year I'm going to try something different.

Over the next year, I have set a goal of reading some of the "Classics" of software development.  These books are highly regarded in developer circles.







While I'm sure this list is not exhaustive, I think it's a pretty good start. (Also, I don't want to overpromise publicly)

I'm a huge fan of Audio books as well, but most of these books aren't in Audio format that I could find and honestly these books are best served up in dead tree format.  There is a lot of code and I'd hate to try to listen to somebody try to read that to me.  The other plus is that I'm planning on using these as reference material to be reviewed later, so I'm highlighting and taking notes.  So paper or e-reader is the way to go.  Also, on the plus side, it's going to look "cool" to have all these books on my shelf at work.

I have heard/read a lot of the information in these books in other places, which is not surprising since these are the original sources.  One of the nice things about this is getting the information in its original form instead of someone else's opinion about what the author was trying to convey.  Another reason I'm reading the books, instead of taking in free content for this purpose, is that the authors of books take a tremendous amount of time carefully crafting these and they are reviewed by editors.  No offense to bloggers/podcasters, but we/they don't always put that kind of care into their final product (and that's ok).

Buying all these books, of course, is not cheap, but the outcome will leave me with some more information and a pretty cool little library that I can draw upon.

I will be writing blog posts on each of these books so you can read my opinion, but most likely there are much more detailed sources of information out there.  I'm going to write my own mostly as a self-review exercise.  You are of course still welcome to read them.  I will also probably include links to reviews I like.  The trick is going to be writing my review first so I don't have outside influences.

So far I've almost finished "Clean Code" and have a pretty good start on "The Pragmatic Programmer".  These books have already cleared up some of the concepts I've been introduced to over the years.  They have also given me flashbacks to some of the terrible code I wrote in my youth, but that's part of the growing process.  Hopefully, when I look back at my code written today, in a couple of years, I'll have the same feeling.

All we can do is keep learning, keep practicing and continue to get better/wiser.



Bonus: (probably not going to be a classic, but still useful)


Friday, December 9, 2016

Hard Work Beats Talent**

The Talent In Neon!!!

So as I've mentioned before I enjoy playing ping pong.  I'm not that great at it, but I enjoy working on new skills.  I also coach a couple of people on how to improve their game.  The reason I'm the one doing the coaching is not due to my incredible skill, but rather due to my willingness to coach.

The other day I was coaching one of our interns who happens to be a woman.  Now, she did not have a lot of table tennis experience at all which is an amazing blessing for a coach, because I didn't have to force her to unlearn bad habits.  She also doesn't have an over-abundance of athletic talent (this is not an insult), by this I mean that she isn't overcompensating for bad technique with fast reaction time or strength.  

What we worked on was the very basic fundamentals, and I can tell you she picked up way faster than I did because she didn't have a bunch of sloppy techniques that work some of the time or the athletic talent to compensate.  She just did the clean techniques over and over and began to ingrain those good motor patterns.  I can tell you that in 20 minutes her game improved at least 200%.  

Talent can be a hindrance.

This is a pretty common pattern I've witnessed in coaching, that with a physically technical skill women will focus on technique immediately because they don't have the extra strength to just push through.  Men will do it sloppily until they reach a stalling point, and only then will they be open to focusing on technique.  The hard part is that depending on the person they may have already invested a lot of time into their existing methods, and that makes change hard.  Some, if they are dedicated to improvement, will seek out assistance on improving.  Others will just keep grinding away the same as before and remain stuck in the same place.  The rest will just quit.

There are many correlations in software development, though it's not gender based.  There will be developers that have a talent for cowboy coding that will just put in the hours and smash out working code.  They don't see any need to improve their skills because they can muscle through it and create "working" code.  The problem with that method is that "it works until it doesn't".  Once you get a big and complicated enough projects, brute force won't work.  At that point, just as above, you can improve, flail or quit.

Even you don't know everything and neither do I.

In coaching my intern in ping pong I was extremely pleased that she listened to me attentively and tried to follow my coaching to the best of her abilities.  She didn't argue or immediately go back to doing it her old way.  She just tried the new techniques as best she could.  Then later in the day she went and practiced it on her own to further build her skills.

To get the most improvement quickly, you need to be open to hearing what your mentors/instructors/coaches have to say.  You don't need to take it as gospel, but be open to the idea that you don't know everything and that there might be a better way.

Now I'm the type of coach that basically said this is the foundation of the technique, but you will need to find your own style.  However, what I was really working on was the principles at the foundation of the techniques.  A backspin serve works pretty much the same no matter how you hold the paddle, what angle you strike it at, foot position etc. 

In development, we have things like SOLID, Clean Code, the DRY principle, and design patterns not to mention all the *DD paradigms (TDD, DDD etc.)  this list is obviously not inclusive.  Taking the time to learn and practice these things is hard and if you are anything like me you will not be good at it at first.  The trick is you need to check your ego, be willing to be a beginner and be ok with failing (in the short term). 

Just like ping pong, learning the new technique will be hard and you may need to unlearn some bad habits, but learning a consistently repeatable sharp technique will improve your coding game a great deal.  Fundamentally solid techniques work as a ladder extension, where working harder at sloppy techniques works as a ceiling.  You can only work so many hours, even if you are 19 years old without a family or a significant other there is still only 24 hours in a day.  Also, if you ever do get other responsibilities you won't have the tools to keep up. Additionally, at some point, you might need to maintain your code and all that technical debt will slow you way down.  These are the things that make it a ceiling.

**Now if you happen to be one of the talented people out there, don't fret, there is good news for all you, "Hard work beats talent unless talent works hard".  So, if you are in either camp or somewhere in between the recipe works the same. Don't get complacent, seek out the best instruction you can find AND listen to it and then put in the work to improve.

Monday, December 5, 2016

Control Your Alerts So They Don't Control You

smart phone, smart girl
At Thanksgiving, my teenage niece was fiddling with her phone at the dinner table and accidentally dropped it.  Since she had been messing with it every few minutes since she arrived, I smiled and put it in my pocket.  From that point on, she was much more engaged with what was going on and participated in conversations.  That part was great.  However, I was having my pocket buzz every couple of minutes with a barrage of notifications from the different apps she had running.  Again I smiled at her and said if my phone did this I would throw it in a lake.  Honestly, I'm amazed she can accomplish anything with that much interruption going on.

Now, I know that young people have a much different relationship with technology than old timers like me, but I also know that an interruption is an interruption no matter what your age is.  My message here is not that you need to get off of all social media and communication apps.  Rather, it is that you need to have control over when and how often you allow them to bother you.

Putting your phone on vibrate is not a solution, it is at best a way to minimize how much you annoy the people in real life around you.

This really comes into play when you are at work or trying to study.  If you are doing anything but the most mundane of tasks, you will need some time to get up to speed with what you are doing and will only really make progress when you get in a state of flow.  Anything that yanks you out of that state of flow, even for a short while, will cost you several minutes to get back up to speed.  So the urge to "quick" check your phone is most likely going to set you back a half hour.

The real trick here is to batch all your alert handling together. Set aside a planned time to deal with all your social media at one time.  If you give yourself a dedicated block of time to handle all your social media and email, you will be more effective at your real work, but also at your social media.

Like most things, there are tools for handling the problem, but it's you that needs to change.  You will need to overcome FOMO (Fear of Missing Out).  We are trained like Pavlov's dogs to respond to notification from our devices.  I know I'm not alone in that when my phone buzzes, I'm extremely curious to know what is going on.  The trick is to get the device tuned to buzz only when it's something I want to know.  Check out this great article on pruning notifications on LifeHacker.

The big takeaway I got from that article was to divide your notifications into three categories:
Important: Get these notifications all the time.
Unimportant: Use notification management to aggregate these notifications so they can be handled in free time.
Useless: Block these all the time.

Our phones by default don't separate the importance of the notifications so we will have to do it ourselves.  The Groupon comes in at the same level as the text from your mom.

Take control of interruptions and eliminate them mercilessly.  Then in your free time (which you should actually have more of) you will have time to focus and put effort into being the best Instagram/Facebook/Pintrest/SnapChat/etc... user you can be.  Work hard and play hard!