Nikola Brežnjak blog - Tackling software development with a dose of humor
  • Home
  • Daily Thoughts
  • Ionic
  • Stack Overflow
  • Books
  • About me
Home
Daily Thoughts
Ionic
Stack Overflow
Books
About me
  • Home
  • Daily Thoughts
  • Ionic
  • Stack Overflow
  • Books
  • About me
Nikola Brežnjak blog - Tackling software development with a dose of humor
Programming

Code Complete 2 – Steve McConnell – Working Classes

I just love Steve McConnell’s classic book Code Complete 2, and I recommend it to everyone in the Software ‘world’ who’s willing to progress and sharpen his skills.

Other blog posts in this series:

  • Part 1: Laying the Foundation
  • Chapter 5: Design in Construction

Class Foundations: Abstract Data Types (ADTs)

An abstract data type is a collection of data and operations that work on that data. The operations both describe the data to the rest of the program and allow the rest of the program to change the data.
For example, if you are not using ADTs to change a bold property of text you could write something like:

currentFont.bold = true;

but a better way, which keeps the abstraction of the class, is:

currentFont.SetBoldOn();

It ain’t abstract if you have to look at the underlying implementation to understand what’s going on. ~ P.J. Plauger

By thinking about ADT, and not about classes, we are programming into the language and not programming in language.

If a stack represents a set of employees, treat the ADT as employees rather than as a stack. Treat yourself to the highest possible level of abstraction.

Try to make the names of classes and access routines independent of how the data is stored.

For example:

game.save()

is better than

game.saveDataInFile()

One way to think of a class is as an abstract data type plus inheritance and polymorphism.

Good class interface

The first and probably most important step in creating a high-quality class is creating a good interface. This consists of creating a good abstraction for the interface to represent and ensuring the details remain hidden behind the abstraction.

If the class interface doesn’t present a consistent abstraction, then the class has poor cohesion.

Class interface consists of public routines (functions, methods)

Each class should implement one ADT!

In some cases, you’ll find that half a class’s routines work with half the class’s data, and half the routines work with the other half of the data. In such a case, you really have two classes masquerading as one. Break them up!

Move unrelated information to another class

Good Encapsulation

Encapsulation is a stronger concept than abstraction.
Abstraction helps to manage complexity by providing models that allow you to ignore implementation details. Encapsulation is the enforcer that prevents you from looking at the details even if you want to.

Don’t expose member data in public

You shouldn’t expose data like this:

float x;
float y;

because client code can monkey around with data. And perfect encapsulation would look like:

float GetX();
float GetY();
void SetX( float x );
void SetY( float y );

Now you have no idea whether the underlying implementation is in terms of floats x, y, whether the class is storing those items as doubles and converting them to floats, or whether the class is storing them on the moon and retrieving them from a satellite in outer space. ?

Avoid friend classes

In a few circumstances such as the State pattern, friend classes can be used in a disciplined way that contributes to managing complexity. But, in general, friend classes violate encapsulation. They expand the amount of code you have to think about at any one time, increasing complexity.

Design and Implementation Issues

Containment (“has a” Relationships)

Containment is a simple idea that a class contains a primitive data element or object. A lot more is written about inheritance than about containment, but that’s because inheritance is more tricky and error prone, not because it’s better.

Inheritance (“is a” Relationships)

Don’t inherit a class instead it’s a truly “is a” more specific version of the Base Class. ~ Barbara Liskov

Inherited routines come in three basic flavors:
+ An Abstract overridable routine means that the derived class inherits the routine’s interface but not its implementation.
+ Overridable routine means that the derived class inherits the routine’s interface but not its implementation

Overridable routine -> polymorphism
+ A non-overridable routine means that the derived class inherits the routine’s interface and its default implementation and it is not allowed to override the routine’s implementation

Don’t reuse names of non-overridable base-class routines in derived classes.

Avoid deep inheritance trees

Deep inheritance trees have been found to be significantly associated with increased fault rates. That’s because of deep inheritance trees increase complexity, which is exactly the opposite of what inheritance should be used to accomplish.

7±2 subclasses from base class, and maximum of three levels of inheritance

Rules for inheritance

  • If multiple classes share common data but not behavior, create a common object that those classes can contain.
  • If multiple classes share common behavior but not data, derive them from a common base class that defines the common routines.
  • If multiple classes share common data and behavior, inherit from a common base class that defines the common data and routines.
  • Inherit when you want the base class to control your interface; contain when you want to control your interface.

Law of Demeter

The rule states that Object A can call any of its own routines. If Object A instantiates an Object B, it can call any of Object B’s routines. But it should avoid calling routines on objects provided by Object B.

Constructors

Initialize all member data in all constructors, if possible. Initializing all data member in all constructors is an inexpensive defensive programming practice.

Enforce the singleton property by using a private constructor. If you want to define a class that allows only one object to be instantiated, you can enforce this by hiding all the constructors of the class and then providing a static GetInstance() routine to access the class’s single instance.

Deep and shallow copy

  • Deep copies are simpler to code and maintain than shallow copies
  • Shallow copies are created typically to improve performance

Prefer deep copies to shallow copies until proven otherwise.

Reasons to Create a Class

Create a class to hide information so that you won’t have to think about it and to reduce complexity. Sure, you will need to think about it when you write the class, but after it’s written you can forget about the implementation details and use the class without any knowledge of its internal workings.

Key points

  • Class interface should provide a consistent abstraction. Many problems arise from violating this single principle.
  • Classes must have data members and behavior
  • Containment is usually preferable to inheritance unless you’re modeling an “is a “relationship
  • Inheritance is a useful tool, but it adds complexity, which is counter to Software’s Primary Technical Imperative of managing complexity

My #notes from the classic Code Complete 2 #book by Steve McConnell chapter 5: Working Classes https://t.co/aWK3uWdBUr

— Nikola Brežnjak (@HitmanHR) August 21, 2017

Books

Flowers for Algernon – Daniel Keyes

My favorite quotes from the book Flowers for Algernon by Darren Hardy which I rated 5/5 on my Goodreads account. Lately, I haven’t been reading any nonfiction books, but this was a great one to start with again.

Now I understand that one of the important reasons for going to college and getting an education is to learn that the things you’ve believed in all your life aren’t true, and that nothing is what it appears to be.

It’s easy to make friends if you let people laugh at you.

Intelligence is one of the greatest human gifts. But all too often a search for knowledge drives out the search for love. This is something else I’ve discovered for myself very recently. I present it to you as a hypothesis: Intelligence without the ability to give and receive affection leads to mental and moral breakdown, to neurosis, and possibly even psychosis. And I say that the mind absorbed in and involved in itself as a self-centered end, to the exclusion of human relationships, can only lead to violence and pain.

A child may not know how to feed itself, or what to eat, yet it knows hunger.

Strange about learning; the farther I go the more I see that I never knew even existed. A short while ago I foolishly thought I could learn everything – all the knowledge in the world. Now I hope only to be able to know of its existence, and to understand one grain of it. Is there time?

There are a lot of people who will give money or materials, but very few who will give time and affection.

No one really starts anything new, Mrs. Nemur. Everyone builds on other men’s failures. There is nothing really original in science. What each man contributes to the sum of knowledge is what counts.

 …the men of the cave would say of him that up he went and down he came without his eyes.

My favorite #quotes from the #book Flowers for Algernon by Daniel Keyes https://t.co/D37Vesvknj

— Nikola Brežnjak (@HitmanHR) August 21, 2017

Programming

Code Complete 2 – Steve McConnell – Design in Construction

I just love Steve McConnell’s classic book Code Complete 2, and I recommend it to everyone in the Software ‘world’ who’s willing to progress and sharpen his skills.

My notes from Part 1: Laying the Foundation are here.

The second part of the book covers the following chapters:

  • Design in Construction
  • Working Classes
  • High-Quality Routines
  • Defensive Programming
  • The Pseudocode Programming Process

In this post I’ll share my notes from the:

Chapter 5: Design in Construction

The Wicked problem is the one that could be defined only by solving it or solving a part of it.

An example is Tacoma Narrows bridge. Only by building the bridge (solving the problem) could they learn about the additional consideration in the problem that allowed them to build another bridge that still stands.

According to Fred Brook, there are essential and accidental types of problems.

Managing complexity is the true primary technical goal in software design.

Internal design characteristics:

  • minimal complexity
  • high fan-in
  • ease of maintenace
  • low-to-medium fan-out
  • minimal connectedness
  • portability
  • extensibility
  • leanness
  • reusability

A good general rule is that a system-level diagram should be acyclic. In other words, a program shouldn’t contain any circular relationship in which Class A uses Class B, Class B uses Class C, and Class C uses Class A.

Steps in designing with objects

  1. Identify the objects and their attributes
    • Computer programs are usually based on real-world entities
  2. Determine what can be done to each object
    • A variety of operations can be performed on each object
  3. Determine what each object can do to the other objects
    • This step is just what it sounds like. The two generic things can do to each other are containment and inheritance
  4. Determine the parts of each object that will be visible to other objects
    • One of the key design decisions is identifying the parts of an object that should be made public and those that should be kept private
  5. Define each object’s public interface
    • Define the formal, syntactic, programing-language-level interfaces to each object. The data and methods the object exposes to every other object are called “public interface.”

Heuristics in terms of Software’s Primary Technical Imperative: Managing Complexity.

Summary of Design Heuristics

  • Find Real-World Objects
  • Form Consistent Abstractions
  • Encapsulate Implementation Details
  • Inherit When Possible
  • Hide Secrets (Information Hiding)

Information hiding is useful at all levels of design, from the use of named constants instead of literals to the creation of data types, to class design, routine design, and subsystem design.

A good class interface is like the tip of an iceberg, leaving most of the class unexposed

Ask yourself what needs to be hidden in this class?

Loose Coupling describes how tightly a class or routine is related to other classes or routines. The goal is to create classes and routines with small, direct, visible, and flexible relations to other classes and routines.

In Software, make the connections among modules as simple as possible.

Life is one big fat program which has a ton of options, but only one nonoptional parameter

The key note is that Classes and routines are first and foremost intellectual tools for reducing complexity. If they’re not making your job simpler, they’re not doing their jobs.

Design patterns

Patterns provide the cores of ready-made solutions that can be used to solve many of software’s most common problems.

  • Abstract Factory
    • Supports creation of sets of related objects by specifying the kind of set but not the kind of each specific
  • Adapter
    • Converts the interface of a class to a different interface
  • Bridge
    • Builds an interface and an implementation in such a way that either can vary without the other
  • Composite
    • Consists of an object that contains additional objects of its own type so that client code can interact with top-level object and not concern itself with all the detailed
  • Decorator
    • Attaches responsibilities to an object dynamically, without creating specific subclasses for each possible configuration of
  • Facade
    • Provides a consistent interface to code that wouldn’t otherwise offer consistent
  • Factory Method
    • Instantiates classes derived from a specific base class without needing to keep track of the individual derived classes anywhere but the Factory
  • Iterator
    • A server object that provides access to each element in a set sequentially
  • Observer
    • Keeps multiple objects in synch with each other by making a third the object responsible for notifying the set of objects about changes
  • Singleton
    • Provides global access to a class that has one and only one instance
  • Strategy
    • Defines a set of algorithms or behaviors that are dynamically interchangeable with each other
  • TemplateMethod
    • Defines the structure of an algorithm but leaves some of the detailed implementation to subclasses

Cohesion refers to how closely all the routines in a class or all the code in the routine support a central purpose

When in doubt use brute force. ~ Butler Lampson

Understand the problem – devise a plan – carry out a plan, look back to see how you did. ~ Polya George

Design practices

  • Iterate
  • Divide and Conquer
  • Top-down and bottom-up
  • Experimental prototyping
    • You have to be prepared to throw away the code (trick: name the classes -prototype-NameClass )

Put your code in a drawer. Then, come and take it out a week later, and you will criticize the fool who wrote it!

People who preach software design as a disciplined activity spend considerable energy making us all feel guilty. We can never be structured enough or object-oriented enough to achieve nirvana in this lifetime. We all truck around a kind of original sin from having learned Basic at an impressionable age. But my bet is that most of us are better designers than the purists will ever acknowledge. ~ P.J. Plauger

Key note for design is to iterate, iterate, and iterate again and after that, you will be happy with your design.

Conclusion

Hope you liked this post and that you’ve seen that this book really has a lot to offer, so I urge you to get your copy, read it and apply it!

Until next time, take care and keep on improving ?

My #notes from the #book Code Complete 2, Chapter 5 by ever so slightly magnificent Steve McConnell https://t.co/GPV0rq6Upd

— Nikola Brežnjak (@HitmanHR) August 13, 2017

Programming

Code Complete 2 – Steve McConnell – Part 1: Laying the Foundation

I just love Steve McConnell’s classic book Code Complete 2, and I recommend it to everyone in the Software ‘world’ who’s willing to progress and sharpen his skills.

I read the book way back in 2011, took notes and wrote them down in my notebook, as I usually do:

In this notebook, I have several book notes, and the best of all of them landed on the inner pages of the covers:

Wishful thinking: one day this will be worth ???

Now, I figured I should get these good passages and quotes and my observations out to the blog for easier search in the future.

Too bad the actual books don’t come with a search functionality, right? ? Well, just get a Kindle, right? Honestly, I did and it seems like I still prefer ‘real’ books.

Anyways, in this post we’ll cover the whole Part 1: Laying the Foundation which consists of 4 chapters:

  • Welcome to Software Construction
  • Metaphors for a Richer Understanding of Software Development
  • Measure Twice, Cut Once: Upstream Prerequisites
  • Key Construction Decisions

The post which covers the chapter 5. Design in Construction is here.

So, let’s get to it, shall we?

Chapter 1: Welcome to Software Construction

Software construction is the central activity in software development. Construction is the only activity that’s guaranteed to happen on every project. The main activities in construction are

  • detailed design
  • coding and debugging
  • integration and
  • developer testing (unit testing and integration testing)

The quality of the construction substantially affects the quality of the software.

Chapter 2: Metaphors for a Richer Understanding of Software Development

An algorithm is a set of well-defined instructions for carrying out a particular task. On the other hand, a heuristic is a technique that helps you look for an answer. Its results are subject to change because a heuristic tells you only how to look, not what to find. Metaphors are heuristics, not algorithms. As such, they tend to be a little sloppy.

Treating software construction as similar to building construction suggests that careful preparation is needed and illuminates the difference between large and small projects.

From perspective of planning it’s not the same to build a doghouse or a skyscraper.

Also, a good metaphor for software construction is an oyster forming a pearl. The image is a good way to visualize incremental development or gradual change.

Thinking of software-development practices as tools in an intellectual toolbox suggests further that every programmer has many tools and that no single tool is right for every job. Choosing the right tool for each problem is one key to being an effective programmer.

Chapter 3: Measure Twice, Cut Once: Upstream Prerequisites

Be sure your preparation activities are reducing risks, not increasing them. If you want to develop high-quality software, attention to quality must be part of the software-development process from the beginning to the end. Attention to quality at the beginning has a greater influence on product quality than attention at the end. In general, the principle is to find an error as close as possible to the time at which it was introduced. The longer the defect stays in the software “food chain”, the more damage it causes further down the chain.

The overarching goal of preparing for construction is risk reduction.

Iterative approaches tend to reduce the impact of inadequate upstream work, but they don’t eliminate it. You might choose a more sequential (up-front) approach when:

  • requirements are fairly stable
  • little project risks
  • long-term predictability is important
  • The cost of changing requirements, design, and code downstream is likely to be high

You might choose a more iterative (as you go) approach when:

  • requirements are not well understood
  • the design is complex, challenging, or both
  • the development team is unfamiliar with the applications area
  • the project contains a lot of risks
  • long-term predictability is not important
  • the cost of changing requirements, design, and code downstream is likely to be low

Part of the programming job is to educate bosses and coworkers about the software-development process, including the importance of adequate preparation before programming begins.

Problem-Definition Prerequisite – the penalty for failing to define the problem is that you can waste a lot of time solving the wrong problem. This is a double-barreled penalty because you also don’t solve the right problem.

The 25% change in requirements results in 70-80% of reworking on the project.

Make sure everyone knows the cost of requirements change.

Requirements Prerequisite – requirements describe in detail what a software system is supposed to do, and they are the first step toward a solution. Paying attention to requirements helps to minimize changes to a system after development begins. If you find a coding error during coding, you change a few lines of code and work goes on. If you find a requirements error during coding, you have to alter the design to meet the changed requirement.

Stable requirements are the holy grail of the software development.

Architecture Prerequisite – Architecture is also known as system architecture, high-level design, and top-level design. The architecture should define the major building block in a program. Every feature listed in the requirement should be covered by at least one building block. Building block should have one area of responsibility, and the minimization of the information that blocks have about each other is needed. Architecture should specify major classes that are used.

It’s good to stick to the 80/20 rule, which specifies the 20% of the classes that make 80% of the system’s behavior.

Esential problem with large systems is maintaining their conceptual integrity.

Typical architectural components are:

  • program organization
  • specification of major classes
  • data design
  • business rules
  • user interface design
  • resource management
  • security
  • performance
  • scalability
  • interoperability
  • internationalization/localization (I18N – Internationalization and L10N – localization)
  • error processing.

The architecture should address all requirements without gold-plating (without containing elements that are not required).

I wonder when managers will start to understand that software development is more than just coding.

WISCA – Why isn’t Sam coding anything?
WIMP – Why isn’t Mary programming?

If you can’t explain something to a six-year-old, you really don’t understand it yourself.

The worst thing that can happen to you is to end up maintaining someone’s code who obviously never heard of classes, cause then you will feel like watching a foreign movie with no subtitles.

Only one subsystem/class should access database

The new design has to be easy to change without affecting business rules and program results.

The architecture should clearly describe a strategy for handling changes.

We’ve always done it that way – be wary of that statement! To this, I’d add “Do your best in trying to inform, but if management doesn’t budge, run away as fast as you can”

Bad requirements – if they are found out later, the fixing costs a lot more.

Chapter 4: Key Construction Decisions

Use a language that you’ve used before, and you will become more experienced with it and more productive

C#, C++, Java, Visual Basic – 5 to 15 times more productive than C, Assembly

Developers working in interpreted languages are more productive than the ones using compiled ones.

Most common languages:

  • Ada – named after Ada Lovelace, the first programmer; used in military, space, and avionic systems
  • Assembly language – assembler, low-level language, used for maximizing speed and code size.
  • C – 1970 Bell Labs
  • C++ – 1980 Bjarne Stroustrup
  • C# – 2001 Microsoft Anders Hejlsberg
  • Cobol – Common Business Oriented Language, developed in 1959 – 1961
  • Fortran – first-high level computer language
  • Java – developed by Sun Microsystems; runs on virtual machine
  • JavaScript – primarily used for client side programming (note by me from 2017: not anymore. Node.js made sure of that.)
  • Perl – string-handling language; often used for system administration tasks.
  • PHP – used to access server-side interactive functions and accessing database information. Note from me: everybody seems to hate this language nowadays ?
  • Python – Python is an interpreted, interactive, object-oriented language that runs in numerous environments
  • SQL – declarative language, meaning that it does not define a sequence of operations, but rather the result of some operations.
  • Visual Basic – high-level, object-oriented, visual programming version of Basic developed by Microsoft.

Programmers who program ‘in’ a language limit their thoughts to constructs that the language directly supports. If the language tools are primitive, the programmer’s thoughts will be primitive.

Programmers who program ‘into’ a language first decide what thoughts they want to express, and then they determine how to express those thoughts using the tools provided by their specific language.

Conclusion

Hope you liked this post and that you’ve seen that this book really has a lot to offer, so I urge you to get your copy, read it and apply it!

Until next time, take care and keep on improving ?

My #notes from all-time classic #book Code Complete 2 by Steve McConnell Part 1: Laying the Foundation https://t.co/8jpjxTgMql

— Nikola Brežnjak (@HitmanHR) August 1, 2017

Books

The Compound Effect – Darren Hardy

My favorite quotes from the book The Compound Effect: Jumpstart Your Income, Your Life, Your Success by Darren Hardy which I rated 4/5 on my Goodreads account:

When the reason is big enough, you’ll be willing to perform almost any ‘how’.

Whatever you vividly imagine, ardently desire, sincerely believe, and enthusiastically act upon… must inevitably come to pass! ~ P. Meyer

Never ask advise of someone with whom you wouldn’t wanna trade places.

You will never change your life until you change something you do daily. The secret of your success is found in your daily routine.

Don’t wish it were easier; wish you were better.

You alone are responsible for what you do, don’t do, or how you respond to what’s done to you.

Forget about willpower. It’s time for why-power. Your choices are only meaningful when you connect them to your desires and dreams. The wisest and most motivating choices are the ones aligned with that which you identify as your purpose, your core self, and your highest values. You’ve got to want something, and know why you want it, or you’ll end up giving up too easily.

It’s not the big things that add up in the end; it’s the hundreds, thousands, or millions of little things that separate the ordinary from the extraordinary.

The first step toward change is awareness. If you want to get from where you are to where you want to be, you have to start by becoming aware of the choices that lead you away from your desired destination.

Your biggest challenge isn’t that you’ve intentionally been making bad choices. Heck, that would be easy to fix. Your biggest challenge is that you’ve been sleepwalking through your choices.

The ultimate measure of a man is not where he stands in moments of comfort and convenience, but where he stands at times of challenge.

The real cost of a four-dollar-a-day coffee habit over 20 years is $51,833.79. That’s the power of the Compound Effect.

All winners are trackers.

Consistency is the key to achieving and maintaining momentum.

My favorite #quotes from the #book The Compound Effect by Darren Hardy https://t.co/nPZmnmjbMw

— Nikola Brežnjak (@HitmanHR) July 30, 2017

Books

Leading Snowflakes – Oren Ellenbogen

These are my notes from an awesome and more importantly practical book Leading Snowflakes by Oren Ellenbogen. I’ve reviewed this one with five stars on my Goodreads account.

Switch between Manager and Maker models

  • Never stop coding!
  • Understand the details of what you gave someone to do
  • Ask for feedback and advice

“It would be good for us to…” vs “I would like to…”
Be nice
Don’t micromanage

Code Review Your management decisions

  • WHEN/WHO/THE DILEMMA/THE DECISION MADE/RETROSPECTION/DID I SHARE THIS?
  • discuss these dilemmas with your boss and see how he would have handled it
  • discuss dilemmas with another engineering manager and review each other decisions
  • do a retrospection every day for ten mins
  • do a retrospection once a month for 1 hour

Confront and challenge your teammates

  • email summaries of your 1on1’s
  • care deeply about your team but don’t care about what they think of you
  • The Asshole Checklist: a) Did I show empathy (not sympathy) b) Did I clarify my expectations c) Did I practice what I just preached
  • share harsh feedback if needed no matter what
  • don’t go helping others on their tasks

Teach how to get things done

  • show how something is done
  • your job is to help someone else succeed
  • small increments (1-3hrs per task)
  • write docs after the feature is finished
  • see if you can have someone teach others

Delegate tasks without losing quality or visibility

  • make a list of things you’re doing today and see which ones you can start delegating
  • use the spreadsheet from the book
  • use the one-page template from the book

Build trust with other teams in the organization

  • in the priority meetings list three priorities that are most important for you in the next week, but acknowledge that you know what is expected of you
  • TEAM is a group of people that TRUST each other
  • There is no I in TEAM
  • Thank you email (or public praise) for a feature well done
  • Internal tech talks
  • Cross-team exchange program
  • Pizzability

Optimize for business learning

  • Acquisition
  • Activation
  • Retention
  • Referals
  • Revenue

Spend 80% on tweaking features and 20% on developing new features.

^ I would tweak this a bit: spend 80% on tweaking features that bring in the 80% of $$.

Use inbound recruiting to attract better talent

  • Answer questions on StackOverflow for 1hr/week
  • Guest blog posts or repost your posts on Medium
  • Have hackathons
  • Birthday pics to Instagram, Facebook, Blog. Also do a video maybe
  • Give talks
  • Have side projects

Build a scalable team

  • Vision
  • Core values
  • Self-balanced
  • Sense of accomplishment
  • Who is putting down fires? – get him to distribute knowledge and mentor others to get the job done
  • Who is an expertise bottleneck – same as above
  • Who is not building trust?
  • On your 1on1’s ask “What is the worst thing about working here?”

My #notes from #Leading Snowflakes – a great #book by @orenellenbogen https://t.co/43h3cFcWmy

— Nikola Brežnjak (@HitmanHR) July 25, 2017

Books

The Complete Software Developer’s Career Guide

John Sonmez (Simple Programmer), an awesome guy that I’m following for some time now just published a new book called The Complete Software Developer’s Career Guide and you can get it here.

Currently the Kindle edition is on sale for less than a buck, so you may wanna jump on this opportunity!

He is the author of one of the best books for Software developers called Soft Skills: The Software Developer’s Life Manual. I wrote a detailed review about that book two years ago, and you can check it out here.

So, for this new book, here’s what he will teach you:

  • How to systematically find and fill the gaps in your technical knowledge so you can face any new challenge with confidence
  • Should you take contract work—or hold out for a salaried position? Which will earn you more, what the tradeoffs are, and how your personality should sway your choice
  • Should you learn JavaScript, C#, Python, C++? How to decide which programming language you should master first
  • Ever notice how every job ever posted requires “3-5 years of experience,” which you don’t have? Simple solution for this frustrating chicken-and-egg problem that allows you to build + legitimate job experience while you learn to code
  • Is earning a computer science degree a necessity—or a total waste of time? How to get a college degree that accelerates your career without burying you under a mountain of debt
  • Interviewer tells you, “Dress code is casual around here—the whole development team wears flipflops.” What should you wear?
  • Coding bootcamps—some are great, others are complete scams. How to tell the difference, so you don’t find yourself cheated out of $10,000
  • An inside look at the recruiting industry. What that “friendly” recruiter really wants from you, how they get paid, and how to avoid getting pigeonholed into a job you’ll hate
  • How do you deal with a boss who’s a micromanager. Plus how helping your manager with his goals can make you the MVP of your team
  • The must-know technical skills that every professional developer should have—but no one teaches you

Now, this indeed is copied ? from his book landing page, but I’m actually 100% certain all of it is true. How? Did I already read the WHOLE book!? Well, here’s the crazy part – during the last year or so, he was giving the chapters of his book for free on his website.

Here’s the review I left on Amazon about this book:

If you don’t like this book, I’m gonna buy it from you

I guarantee that if you follow John’s advice, if you trust the process, you’ll turn your software career around! Ever since I started following John via his blog and YouTube videos and applying what he teaches I need binoculars to look way back where I was. I can’t say a big enough thank you to John and this book is just a huge collection of everything you’ll ever need to know to succeed in this ever so slightly lucrative field of software development.

I personally believe that the concept of ‘trusting the process’ is the best skill to cultivate and nurture because it will catapult your success forward in ways you can’t imagine. He has some more videos about this topic, and you can watch them on his YouTube channel here. But, as many say:

It’s simple, but not easy

So keep that in mind and don’t back down when things get hard!

The Complete Software Developer's Career Guide is an awesome #book by the ever so slightly magnificent @jsonmez https://t.co/LI1JoF7yyU

— Nikola Brežnjak (@HitmanHR) July 19, 2017

Books

#AskGaryVee – Gary Vaynerchuck

My favorite quotes from the book #AskGaryVee: One Entrepreneur’s Take on Leadership, Social Media, and Self-Awareness  by Gary Vaynerchuk which I rated 5/5 on my Goodreads account:

Smart work will never replace hard work. It only suplements it.

Putting your self out of bussiness is a lot more fun than having someone else do it for you.

I put zero weight into anyone’s opinion about me because I know exactly who I am. Can you say the same?

Stop focusing on dumb shit. Don’t be afraid to break things. Don’t be romantic. Don’t take the time to breathe. Don’t aim for perfect. And whatever you do, keep moving. Reread this a few times…

Passion is an unmatched fuel. Add being happy to that and you have a wonderful formula for good health.

Ideas are worthless without the execution; execution is pointless without the ideas.

My kids’ generation may be the last generation that holds university to such high esteem.

If you’re not producing content, you don’t exist.

A lot of new entrepreneurs tell me they’re hustling, and then they’ll ask me if I liked the last episode of Ballers. They’re trying to get a business off the ground and they’ve got time to watch TV? It’s like wanting to lose weight and sneaking away to scarf down a Big Mac. It’s just not going to work. I’m twenty years into my career with two businesses under my belt and the only time I take to watch TV is when the Jets are on. There is so much hustle in my day I don’t even have a second to spare to “hang out” and catch up with the people around me when I’m at work. It may not be ideal for most, but I love it because it allows me to get the things done that I seek to accomplish.

Once people love you, it’s easy to sell them stuff.

Everybody’s got a plan until they get punched in the face. You can strategize and plan all you like, but once you’re on the court, or in the ring, or on the field, you’d better be ready to adjust and improvise.

If you like these quotes, be sure to check out Gary’s other book I read: Crush It!

Favorite #quotes from an awesome #book #AskGaryVee by the ever so slightly remarkable Gary Vaynerchuck https://t.co/4AVVXGWvO7

— Nikola Brežnjak (@HitmanHR) July 18, 2017

Books

Crush It! – Gary Vaynerchuk

My favorite quotes from the book Crush It!: Why Now Is the Time to Cash In on Your Passion  by Gary Vaynerchuk which I rated 4/5 on my Goodreads account:

Love your family, work super hard, live your passion.

Live your passion. What does that mean, anyway? It means that when you get up for work every morning, every single morning, you are pumped because you get to talk about or work with or do the thing that interests you the most in the world. You don’t live for vacations because you don’t need a break from what you’re doing—working, playing, and relaxing are one and the same. You don’t even pay attention to how many hours you’re working because to you, it’s not really work. You’re making money, but you’d do whatever it is you’re doing for free.

There no longer has to be a difference between who you are and what you do.

Even if your ambitions are huge, start slow, start small, build gradually, build smart.

Developing your personal brand is key to monetizing your passion online. Developing your personal brand is the same thing as living and breathing your résumé.

Quality is a tremendous filter. Cream always rises, my friends, no matter how many cups of coffee you pour.

Know yourself. Choose the right medium, choose the right topic, create awesome content, and you can make a lot of money being happy.

 

Favorite quotes from the #book Crush It by the ever so slightly awesome Gary Vaynerchuk https://t.co/UL7L1yhkGj

— Nikola Brežnjak (@HitmanHR) July 17, 2017

Books

You Are a Badass – Jen Sincero

My favorite quotes from the book You Are a Badass: How to Stop Doubting Your Greatness and Start Living an Awesome Life  by Jen Sincero which I rated 4/5 on my Goodreads account:

“If you’re serious about changing your life, you’ll find a way. If you’re not, you’ll find an excuse.”

“You are loved. Massively. Ferociously. Unconditionally. The Universe is totally freaking out about how awesome you are. It’s got you wrapped in a warm gorilla hug of adoration. It wants to give you everything you desire. It wants you to be happy. It wants you to see what it sees in you.”

“What other people think about you has nothing to do with you and everything to do with them.”

“Because if you base your self-worth on what everyone else thinks of you, you hand all your power over to other people and become dependent on a source outside of yourself for validation. Then you wind up chasing after something you have no control over, and should that something suddenly place its focus somewhere else, or change its mind and decide you’re no longer very interesting, you end up with a full-blown identity crisis.”

“So often, we pretend we’ve made a decision, when what we’ve really done is signed up to try until it gets too uncomfortable.”

“Maybe, if you put your disbelief aside, roll up your sleeves, take some risks, and totally go for it, you’ll wake up one day and realize you’re living the kind of life you used to be jealous”

“Nobody who ever accomplished anything big or new or worth raising a celebratory fist in the air did it from their comfort zone. They risked ridicule and failure and sometimes even death.” 

“The only failure is quitting. Everything else is just gathering information.” 

“If you are depressed, you are living in the past. If you are anxious, you are living in the future. If you are at peace, you are living in the present.” 

“I can pretty much guarantee that every time you tearfully ask yourself the question, “WTF is my problem?!” the answer lies in some lame, limiting, and false subconscious belief that you’ve been dragging around without even realizing” 

“There’s something called the Crab Effect. If you put a bunch of crabs in a bowl and if, while they’re in there crawling all over each other, one of them tries to climb out, the rest of them will try to pull him back down instead of helping to push him out. No wonder they’re called crabs.” 

“Because so often when we say we’re unqualified for something, what we’re really saying is that we’re too scared to try it, not that we can’t do it.”

“You need to go from wanting to change your life to deciding to change your life.”

“What you tell yourself on a daily basis is more powerful than you know.” 

“Our greatest fears are the greatest waste of time.” 

“Comparison is the fastest way to take all the fun out of life.”

My favorite #quotes from the #book You Are a Badass by Jen Sincero https://t.co/XUV6CZ0lWi

— Nikola Brežnjak (@HitmanHR) July 10, 2017

Page 5 of 12« First...«4567»10...Last »

Recent posts

  • Discipline is also a talent
  • Play for the fun of it
  • The importance of failing
  • A fresh start
  • Perseverance

Categories

  • Android (3)
  • Books (114)
    • Programming (22)
  • CodeProject (35)
  • Daily Thoughts (77)
  • Go (3)
  • iOS (5)
  • JavaScript (127)
    • Angular (4)
    • Angular 2 (3)
    • Ionic (61)
    • Ionic2 (2)
    • Ionic3 (8)
    • MEAN (3)
    • NodeJS (27)
    • Phaser (1)
    • React (1)
    • Three.js (1)
    • Vue.js (2)
  • Leadership (1)
  • Meetups (8)
  • Miscellaneou$ (77)
    • Breaking News (8)
    • CodeSchool (2)
    • Hacker Games (3)
    • Pluralsight (7)
    • Projects (2)
    • Sublime Text (2)
  • PHP (6)
  • Quick tips (40)
  • Servers (8)
    • Heroku (1)
    • Linux (3)
  • Stack Overflow (81)
  • Unity3D (9)
  • Windows (8)
    • C# (2)
    • WPF (3)
  • Wordpress (2)

"There's no short-term solution for a long-term result." ~ Greg Plitt

"Everything around you that you call life was made up by people that were no smarter than you." ~ S. Jobs

"Hard work beats talent when talent doesn't work hard." ~ Tim Notke

© since 2016 - Nikola Brežnjak