Tips to Improve English

No matter what your native language is you know how important English language is. I am a Vietnamese. I have had so many difficulties with learning English. I have studied English since I was grade 8. However, to be honest, I did not do any good before I got my first job, after my first year at the job. Even at that time, I was not that good either. I was not bad.

I can spend a whole day to give a long list of reasons why I did not do good. But just like any finding good excuses process, most of the reasons for not doing good are from outside. It is so easy to blame someone or something. Fortunately, 2 years ago, I discovered that the most important reason for not doing good was ME. In particular, here are some

  1. I did not actively learn English.
  2. I did not practice much (not mentioned that NONE)
  3. I did not look for ways to learn English.
  4. I was lazy to pronounce words.
  5. ….

Oh! they are common reasons. And they are vague and general. Which also means that they are useless. Because I cannot go anywhere with them. How do I know where to start with that list?

Fortunately, from Mr. Jim Rohn, I knew that I must start from the Fundamentals. I trust that principle. I applied it. And It works for me.

Here are some small tips that have helped me better at English every day.

Stupid Driver

I have spent lots of time on travel, either motorbike or car, from home to work and back. I decided to take advantage of those wasted hours. Instead of complaining about the road, the traffic, I practiced speaking English on my own.

The process is simple. I do not need to learn any new word. Therefore, I do not lose focus on driving. I knew that I usually forget the final sound, such as pronouncing “is”, “wish”, … Those are words I have known for years. But I have ever never got it right in speaking 🙁 While driving, I will pronounce them in the best way I can. Of course, I know how to pronounce them. The problem is not about knowing, it is about practicing. And I want to kill my laziness of moving my mouth while speaking.

The key point here is that you must speak. Do not whisper in your head. I repeat “Do not whisper in your head.” By speaking out loud, I can overcome the fear of *someone else judgment* To make it more fun, I made sentences. Many bad, careless drivers on the street, when I saw them, I spoke: “he is a stupid driver“. Well, It was not nice to say that. But who cares. I speak for myself, not in a public or pointing fingers to someone.

I have become a stupid driver since then. I have spoken to myself as a way of practicing the pronunciation. Oh yes. It works pretty well for me.

Passive Youtube

Most of my time is in front of a computer. I am a software developer. I do not have the time nor interested in taking English classes at night. Instead, I decided to take advantage of Youtube, passively.

There are a number of Authors that I want to learn, Mr. Jim Rohn is the best one. While working, instead of listening music, I listened to them. I did not pay much attention to what they were saying. I did pay attention to when I viewed the first time. Which means I already knew the content (I do not understand everything I listen to of course). But I have had an idea of what the talks are about.

For each talk that I like, I listened to them many times passively. Amazingly, I could capture their voice, their tongue, their words. Just keep listening and the brain will take care of the rest.

Active Reader

To grow in life, I need to read more books. I decided to read English books. There are many benefits of using English books. However, here is the tip that I use to improve my English. For the first 20 – 30 minutes (usually in the morning), I will read the books out loud. Usually, we read by eyes or whispering in the head.

I read the books with voice and rhythm. After 30 minutes, I feel tired, then I read as normal. One stone, two birds!

Write and Write

One of the reasons for this Blog is to practice writing. Which improves my English tremendously. Whenever possible, write in English. I have built a habit of writing everything in English, of course, as far as I can 😛

The biggest issue with writing is this: Oh man, my English is terrible. I do not know how to write. People will laugh at me. They will make fun of me

Stupid! Everyone has their own share of mistakes. No one is perfect. So who cares! I took a deep breath and moved on.

Final Thoughts

There are so many ways to learn English. But if you wait for having a right class, to have a right teacher, to have someone teach you, you will miss the train of life. Those people, those movements will not come.

Instead, look deep into your current circumstances, find a way to tweak around, and start with smallest possible actions. I am sure you will realize that you can do lots of things, that you are not in a bad situation as you thought.

Those tips work for me. They might also work for you. Who know until you give it a try.

Book Review: The 5 Seconds Rule by Mel Robbins

I have finished reading the book. I made many notes, highlights from my Kindle. They are all available in My Notes On Goodreads. I am practicing the habit of reviewing my notes right after I finish reading. While reading the notes, I can recall my memories and connect the content in the book. I just realized that I have something in my head. I also know that I want to write them down.

Writing down the thoughts is not an easy task. However, the book has taught me a secret – the courage to do things. You guess it. By counting down 5-4-3-2-1 DO.

I, actually, do not do a book review at all. I chose that title because I have not found any word to replace. Reviewing a book is a big deal. I am not going to do that. Instead, I want to focus my energy on writing what I have learned from the book. I want to write the good part that the book conveys and wants to give to the reader. Others might have different views. They might see the opposite side of the book. I do not look for what is not good. I focus on what is good, on what is in it for me, on what I can take away and apply to my life.

The idea in the book is ridiculously simple. Everyone has 5 seconds to convert from intent to action. By counting down, yes counting down – not up, 5-4-3-2-1 DO.

The moment you have an instinct to act on a goal you must 5-4-3-2-1 and physically move or your brain will stop you.

In my word, move your ass. Nothing happens unless you move your ass. You must move physically.

A normal, but famous, example is getting up early. “Early” means you wake up at the time you want to get up before you go to sleep. For example, many people want to get up at 6:00 AM to do exercise. Every evening, while on the bed, they tell themselves that they will wake up at 6:00 AM in the morning. When the clock alarms, a hidden voice tells you

  1. Hey, you went to bed late last night
  2. Hey, it is cold out there
  3. Hey, com’on it is weekend
  4. Hey, just stay here for 5 minutes
  5. ……

The result? You wake up at 8:00 AM. And the cycle repeats.

The book tells you a simple, but powerful, tip to overcome that habit by counting down: 5-4-3-2-1 UP (use the word that you like most). Right after reaching “1”, out of bed.

I think many people will laugh at that tip and think that it will not work. Sure, it will not work if you think it will not work. Here is the simple fact

  1. If you give it a try, you get 50% success, 50% failure
  2. If you do NOT try, you get 100% failure

 

Another interesting thing I found from the book is the explanation of “procrastination”

For a long time, everyone believed procrastination meant poor time management skills, a lack of willpower, or lack of self-discipline. Boy, were we wrong. Procrastination is not a form of laziness at all. It’s a coping mechanism for stress.

And

Dr. Pychyl has found that the main thing driving procrastination is not avoiding work. It’s avoiding stress. Procrastination is “a subconscious desire to feel good right now” so you can feel a little stress relief.

And that is because of our default behavior of our brain

We are amazing at fooling ourselves into staying exactly where we are.

Th human being is afraid of changes. Our brain is designed to protect us, to keep us safe. It builds a self-defense mechanism.

As I mentioned in Chapter One, change requires you to do things that are uncertain, scary, or new. Your brain, by design, will not let you do such things.

That’s why we love sitting on Sofa, watching a TV show, a movie. The Sofa makes us feel comfortable and safe.

As I read through the book, I thought of many real examples I have been and I have seen. Kind of fun when you reflect on your life. You should try it.

 

Another thing I learned from the book is how people make decisions. It turns out

According to neuroscientist Antonio Damasio, it’s our feelings that decide for us 95% of the time. You feel before you think. You feel before you act. As Damasio puts it, human beings are “feeling machines that think” not “thinking machines that feel.” And that’s how you ultimately make decisions—based on how you feel.

You Make Decisions Based On How You Feel

 

I would suggest people read the book. I have started applying what I have learned in it. If I want to do something or get something done, or whatsoever I want to do, I would choose this

5-4-3-2-1 MOVE-YOUR-ASS!

Code That Embraces Changes

Developers write code. They write code for specific functionalities, with requirements from clients (customers, bosses, leaders,…). When requirements come, they know what to do; know what code to write. In the world of business applications, the implementation is not a big deal. The story might be different if we write code for embedded systems using C/C++.

However, most of the problems come later, when the first draft of the function has done. The functions have deployed to the customers. They test and realize that they have to change here and there. If I have to pick one constant in the software development, I would pick CHANGE. The clients will change their mind. They know better when they actually see the product. You, as a developer, cannot avoid changes and cannot tell clients stop changing. No. It does not work that way.

Agile emerges with the spirit: Embrace changes. A wonderful mindset shift! We have to adapt that fact. However, the biggest question remains: How do you deal with changes?

How do you deal with changes in code?

I know that there are processes to deal with changes. But, ultimately, it all comes down to the code. You have to change the code, most of the time you have to.

I do not have a single answer or solution to that problem. However, I do have some experience in designing code that gives me the courage, the tool to embrace changes.

Here we go. But first, let’s define a simple feature. We have to work on a concrete example.

Requirement

As a business owner, I want to export orders (that are made today) into CVS file so that I can import into Excel and build some charts.

Assumption: There is a shopping system. They take orders from users. The orders are stored in the database. They are all basic stuff if you have ever worked with a business application system.

First Implementation

Without any hesitation, jump right into the VS2017 and implement the feature. Btw, how hard it is to implement such a simple feature, right?

    public class Order
    {
        public string Customer { get; set; }
        public DateTime OrderedAt { get; set; }
        public decimal TotalCost { get; set; }
        public int NumberOfProducts {get;set;}
    }
    class Program
    {
        static void Main(string[] args)
        {
            var ordersFromDatabase = new List<Order>
            {
                new Order{Customer = "Batman", TotalCost = 100000, OrderedAt = DateTime.Today.AddDays(-3)},
                new Order{Customer = "Superman", TotalCost = 1000, OrderedAt = DateTime.Today.AddDays(-2)},
                new Order{Customer = "Spiderman", TotalCost = 100, OrderedAt = DateTime.Today.AddDays(-1)}
            };
            const string headers = "Customer;Total Cost;Ordered At";
            var data = new List<string>{headers};
            foreach (var order in ordersFromDatabase)
            {
                data.Add(string.Join(";", order.Customer, order.TotalCost, order.OrderedAt));
            }
            var fullPathToCsvFile = @"d:\export\orders.csv";
            File.WriteAllLines(fullPathToCsvFile, data, Encoding.Unicode);
        }
    }

The actual implementation in a real project will be different. To demonstrate the point, I simplify the code.

What do we have above?

  1. An order has 3 information: Customer, Total cost, and Ordered At.
  2. There are 3 orders for Batman, Superman, and Spiderman. Assuming that they come from the database. Batman is a rich man so he ordered a lot 😛
  3. Export to CVS with “;” deliminator.
  4. The file is located at “d:\export\orders.csv” with Unicode encoding.

The code works. Mission accomplished.

Changes Come

Here are some changes that a customer might want to make

  1. Add NumberOfProducts into the export
  2. Change the location of exported file or even the encoding.
  3. Hey. I want to see reports of 2 days instead of just today.
  4. ….

Things go on in various ways. Finally, they all come to you, developers, to reflect the changes in code. If the application is just a simple stupid console app in this example, there is not any problem at all. Everything can be changed in a matter of minutes.

But we all know that it is not true in the real life.

Embrace Changes

I would prefer to do some logical analysis before actually writing code. If I start my code first, it will affect my thinking process. Sometimes it helps.

To embrace changes, we, first, must identify the possible changed areas. Isolate and Conquer approach

  1. Identify the possible changed areas
  2. Isolate them. Mean you can conquer them. Because you know where to look at, where to change the code.

Identify

Next and hardest question is

How to identify those areas?

Answer

Think in process and interaction. Capture concepts and patterns

Back to export order example. What does it mean? How do I apply in that example?

What is the process of exporting order?

  1. Get the orders
  2. Build data
  3. Write data into CVS file
Export orders process
Export orders process

Obviously, the process will not change. Because we control how we want to implement it. In other words, it does not depend on the customer. What changes? The 3 boxes: Get orders, Build data and Write to file.

Let’s go through each of them

Get Orders

  • Where to get them?
  • How to get them?
  • Criteria

Build data

  • How many columns do we need?
  • What is the format of currency, datetime, … ? the presentation of the data

Write to file

  • What deliminator to use? “;” or “,”? Maybe directly to Excel file?
  • Where to store the file? in which encoding?
  • What if the file fails to save due to permission?

Let’s say we have identified them. Now, let’s isolate them.

Isolate

I will modify the code as below

    class Program
    {
        static void Main(string[] args)
        {
            var orders = GetOrders();
            var data = BuildData(orders);
            WriteToFile(data);
        }

        private static IList<Order> GetOrders()
        {
            return new List<Order>
            {
                new Order{Customer = "Batman", TotalCost = 100000, OrderedAt = DateTime.Today.AddDays(-3)},
                new Order{Customer = "Superman", TotalCost = 1000, OrderedAt = DateTime.Today.AddDays(-2)},
                new Order{Customer = "Spiderman", TotalCost = 100, OrderedAt = DateTime.Today.AddDays(-1)}
            };
        }

        private static IList<IList<string>> BuildData(IList<Order> orders)
        {
            // Initialize rows with header
            var rows = new List<IList<string>>
            {
                new List<string> {"Customer", "Total Cost", "Ordered At"}
            };
            // Add rows data for each order
            foreach (var order in orders)
            {
                rows.Add(new List<string>
                {
                    order.Customer,
                    order.TotalCost.ToString(CultureInfo.CurrentCulture),
                    order.OrderedAt.ToString(CultureInfo.CurrentCulture)
                });
            }
            return rows;
        }

        private static void WriteToFile(IList<IList<string>> data)
        {
            const string deliminator = ";";
            var fullPathToCsvFile = @"d:\export\orders.csv";
            var csvData = data.Select(a => string.Join(deliminator, a))
                .ToList();
            File.WriteAllLines(fullPathToCsvFile, csvData, Encoding.Unicode);
        }
    }

Each method in the Main class encapsulates a concept, area that we have mentioned. Whether we should move them into separated classes is not that important. But yes, you should move them when in production code.

With that in place, when clients want to change something, you are more confident to embrace them. Or when there are bugs. In the beginning of the post, I mentioned that clients want to add NumberOfProducts into the report. Do you know where to change? Yeah! You got it – change in the BuildData method.

The above refactoring is good to embrace changes. However, we can make it better. I leave it to you if you wish to challenge yourself.

Takeaway

Take the “Embrace changes” seriously with you. Train your mindset into the concept. As a developer, we must be aware of that simple fact. Complaining about them will not solve the problem. You will have to deal with it anyway. Better, you should be in proactive position. Changes come! Not a problem!

When implementing a new feature, write new code, I would suggest that you stop for a moment, draw the process, the interaction in your head (better if you do it on paper) before you actually write code. Once you have done that, the possible changes areas emerge. Capture them immediately.

I have a simple process for you

  1. Think about the process, the interaction in normal language. Not the language of the code.
  2. Identify the possible changes areas.
  3. Capture them immediately. You should write them down in the paper.
  4. Write code.
  5. Design patterns, best practices come last.

I hope you enjoy the reading and use them for your next piece of code.

Have a nice day!

Knowledge and Skill “I Know vs I’ve Done”

Recently I watched a wonderful course on Pluralsight. It made me reflect again on my personal thought about Knowledge and Skill. For the past 2 years, besides my coding job, I have had the pleasure to interview and hire resources for my company. I have met many talented people. They know a lot of stuff. Some have many certifications. They are good. They have spent their time on getting them, taken exams, … No one can deny that fact.

In the context of working as a developer, tester, I mean building software, you are paid to do something. You are paid to bring your knowledge into practice, to use knowledge to produce something. You are paid for your Skill.

Skill is not built from what you know. Skill is built from what you have done. You gain skills by doing things. Of course, you must know things first. That is obvious, right?

Hey, but why do we care about differentiating between Knowledge and Skill? It might trigger a self-reflection of where we are, what value we bring to the marketplace. For me, It helps me tremendously. It forces me to think no matter where I am, I need to gain more skills, bring more value.

Let take an example of a web developer using ASP.NET MVC as their main tool for building web applications. He has 3 years experienced, counted since the first time he worked on an MVC project. Let’s examine what he knows and what he has done.

Knowledge – He Knows

By googling, reading some articles, reading some books about ASP.NET MVC framework, he gains a certain knowledge about

  1. What ASP.NET MVC is
  2. How to start an MVC project
  3. There are Controllers, Actions, Attributes, Routing, …
  4. Support Dependency Injection
  5. That MVC is a cool framework.

He knows a lot. When asked, he can cite from his reading. He even can compare MVC with other frameworks.

In the information age, you can gain knowledge quite easy. There are millions of materials out there, with both free and paid ones. If you want to know something, ask Google.

My friends, nowadays knowledge is free.

There are areas where people will pay for your knowledge (just make sure you have a solid one). However, a vast majority of developers is working in companies, writing code, producing software. Knowledge cannot produce software. Skill does.

Skill – He Has Done

In the interview, I usually ask what you have done precisely in the last 3 years. Which parts of the MVC framework that you have practiced most?

The answer I have received most is “I work on the business logic part. MVC has done everything else for me.” A very honest, correct answer! And many developers have done the same thing.

Given the Knowledge part, he knows ASP.NET MVC. However, he have not done any of these

  1. Code outside of a Controller – Action. Not create any custom attribute.
  2. Not knowing how to handle database transaction in an MVC application.
  3. Playing around with custom routing.
  4. Handling security

The list goes on.

The point is that he does not seem to have any ASP.NET MVC skill. How much value is he in the MVC field? As an employer, I think NOT much. There are so many developers know about ASP.NET MVC. But a few actually is able to use it. What the market needs are ones who can use it, not just know it.

 

Knowledge is unless it is used to solve problems. People are paid to solve problems. The takeaway key from differentiating Knowledge and Skill is we should be well aware of the illusion of knowing things. We have to gain more knowledge every day. At the same time, we have to find a way to improve our skills. They have to be in synced.

Next time, if you come to your boss and ask for raise, bring your skill list. Do not tell him what you know. Tell him what you have done and can do.

I am happy that I, now, have a clear thought about different between Knowledge and Skill, the importance of each. I am also glad that I have started my quest to skill with my Reload 2017.

Agile, My Own Version

People talk about agile these days in Software Project Management. Each has their own understandings and practices. Sometimes, I have a feeling that people focusing too much on its concept; on what it is; on what we should apply; on how to apply …

Is there any problem with that? I do not know. I cannot judge someone decisions.

However, these are what I know. I know that I have to start with asking the right questions, that Agile is a tool to solve a set of problems.

  1. What are my problems?
  2. How can Agile help solve my problems? Has it solved the similar problems?
  3. What are fundamental steps I should follow?

What Are Problems?

You cannot bring a tool to fix a problem that you have not known. It seemly does not work. There are hundreds of problems when running/working a team. Each team has different set of problems. There is no perfect team, my opinion.

The first step is to identify basic problems that the team is facing. As a software development team, there are some common problems that I have seen. Yours might be different than mine.

Lost Focus

What if you ask a developer in your team “what are our goals this week?“. I hope you will get good answer that your members know the team’s goals. From my experiences, they cannot say clearly about the team’s goals. They might say let me check the board. The point is that those goals are not clear to them.

Why? There are 2 possible reasons I could think of

  1. Developers are so focus on their tasks (or they say so). Everyone has their own “to do” list on their mind.
  2. The goals themselves are vague. Even the leader cannot say it clearly in 1-2 sentences.

Low Productivity

Output is not good. There is a high bug rate, high regression bugs. There are different definitions for Productivity depending on the team and organization. However, in short, Productivity means you deliver what you are supposed to deliver.

Why?

  1. Lost Focus (from above): People are not aware of what they should deliver.
  2. Cooperation: a crucial factor of a team.
  3. Lack of energy: There is no rhythm in the team. People feel bored.

Agile as a God

Agile has emerged. People pay attention to it, read articles, books. And they quickly start to apply in their own teams and organizations.

Then we see people asking about “how to apply agile?”, “why does Agile not work in their team?”, …

Imagine the situation when you come to your team meeting with a strong claim: guys, we apply Agile. Then you start explaining about it. How cool it is. How popular it is. You have hundreds of reasons. You, then, set up Kanban board, announce daily standup meetings, … all other practices written for Agile.

What will you get after some weeks?

Soon you will chase to solve another new problem: why has Agile not worked with my team?

Wait a second! What was the problem that we wanted to solve at the first place? I hope someone in the team will ask that question.

Agile, on My Eyes

I would like to use Agile as adjective (yes, Agile is an adjective). That is Agile is a set of principles to help us improving our way of thinking, help us delivering better software, better output. That it has some practices to help us solving (improving) our problems (some I mentioned above).

I do not like to think Agile as a set of processes, steps, … or a set of instructions that we should follow.

Let take it small steps.

Daily Standup Meeting

The most common concept that people talked in that meeting is the three questions. In the nutshell, they are

  1. What have you done yesterday?
  2. What will you do today?
  3. What block your way?

My opinion, they are boring. I do not think they work as expected, either. To force myself from not thinking about them, I called them Three Stupid Questions.

Wait! What the problems the meeting is trying to solve? Focus and Cooperation. By letting the rest of the team knows what you have done, everyone has the same vision. By raising the impediments, other can have a chance to help. The intentions are good.

However, in practice, I have not seen it worked (I know it might work on other teams). How to verify that? I suggest asking one of these questions (after the meeting)

  1. How far are we closed to the delivery?
  2. What were the team’s accomplishment yesterday?

Pyramid and Brick

I created my own version of daily standup meeting. The main idea is to utilize the visualization. In stead of writing the goals in words, I draw a picture with the concepts of Pyramid and Brick.

Agile DailyMeeting Goals Visualization
The visualization of the goals for the team

It must be a hand-drawing one. Team leader will draw it everyday in the team meeting.

  1. Pyramid: is the rectangle.
  2. Brick: the yellow or black boxes.
  3. The window on the top right: The visualization of the delivery. In this example, it is a web form.
  4. The face (with 2 arms): The team. The team controls the pyramid. They are in charged of everything. In the end of the meeting, it will either a smiled or sad face.

How does it work?

In the first meeting of the week (or sprint, I prefer weekly basic), the team will help build the pyramid. Bricks are work they have to do to build the pyramid. In the Agile terminologies, they can be either Epic, Feature, User Story, Bug, or task.

On the next meetings, each member will say what they have done will either move the bricks forward or out of the pyramid.

Agile Goals DailyProgress
Check the daily progress. Should be more yellow bricks. The red ones are out of track

By having this visualization, everyone is more aware of what going on and how far they are closed to the delivery without reading a whole bunch of words.

At the end of the meeting, we should expect this happy face. If not, we should draw a sad face, honestly.

Agile DailyMeeting HappyFace
A happy face we should expect at the end of the meeting

It depends on the creativity of each team to make the visualization alive. The more creative the better they will remember.

Task Based Completed

Put aside the requirement of having a good user story. Because we do not have that much luxury. The reality is that most of the time, we do not have a clear requirement, a well-written user story. That causes some problems. One of them is the feeling of getting thing done. Having spent more than 8 hours per day, working hard on the job, and the next day, we cannot proudly say what exactly we have done. We are kind of aware of what we did, but fail to name them.

To improve the situation, we came up with “Task Based Completed“, known as “The Golden Board“. In the Standup Meeting, your face should be on the board. There is no rule, no punishment, nothing required. Simply your face should be on the board. If not, not a problem, see you tomorrow. Again, your face should be on the board.

There are some benefits with this approach.

  1. Encourage the cooperation and design. To breaking down in to small delivered tasks, they have to cooperate with each other and in that process, design the system. Tasks become your technical design documents.
  2. Short error prone detection cycle: While implementing a task might spot a fraud in the design or requirement. The sooner the better.
  3. Feel good. We know for sure that we have done something; that we get the job done; that we move things forward; that we cooperate with others.

One of the key point to make this system works is to make the task creation/completion super easy. In other word, do not put processes in the task creation. Task creation should be easy as creating a task in to-do list application. However, one should be improving the task’s name. The task’s name should be clear and understandable to the creator. Again, there is no requirement for others to understand others’ tasks.

 

Final Thoughts

Tools are tools. They are their to help us, human being, do our job. Each tool solves a set of problems. Before applying any tool, make sure we analyze our problems first.

When come to the teamwork, the most important factor is people, not tools/processes. Do not throw a tool to a person without instruction/training.

Boy Dig a Whole
Boy, here is the hoe, dig a whole.

Have a good week!