Why C++

I’m a year and month into a Perl job at a fantastic company and my C.V. was online waiting for C++ jobs. The company I work for is great. Great money, I’m in a great, very Agile and very positive team with high morale shared by all. I feel respected by my peers. We work well, we can deliver things we’re proud of. The company supports us Open Sourcing our software, writing Blogs and expressing ourselves creatively. I have enough responsibility, there are hack days and tech talks. We host user group meetings too. Damian Conway, a respected Perl community member and author of “Perl Best Practices” has been in to train us with regards to writing better APIs. This e-commerce company knows its development team is an important asset and we feel respected. On top of that the company has a wealth of other benefits, such as free drinks once a month, great summer and winter parties, a 50% discount on their own site, plenty of holiday, flexitime. Life is good. To the point where I question why I would leave this company. There is still plenty to learn, contribute and career paths within the company.

I’ve enjoyed working there and I even see a remarkable character ark in my own personality, losing my “small company mentality” of “pushing people to deliver” to this company’s “Be Agile, treat others well, work together in defining tasks, be patient in sharing understanding and watch them exceed the quality you’d expect to deliver”. The soft touch really works and in combination with Dale Carnegie’s book “How to win friends and influence people”, I really feel like a better person that I used to be. I’ve always been self-motivated but now my motivation is reinforced by working with equally motivated people. It takes a great company to make you a better person.

However as I shake off what I perceive to be small company mentality that all must know what I do and be as disciplined in good OO design and debugging as me (or as I perceive myself at least), I can’t get over the fact that your choice of language is important. That as different languages are suitable for different types of program, it’s also suitable for different types of programmers. Think real programming is about delivering features? Think real programming is mastering the Zen between hardware limitation and scalability? Maybe you slightly idolise the power one language gives over another, in terms of speed of development or control over memory? I do.

For some reason I’m fixated on C++. In a few days I’ll begin my first C++ job and become a “professional C++ developer” for a company who maintains a pretty old MFC application that’s been around since the 90’s. So why C++? What’s the pull and need to write it?

I think it comes down to the amount of discipline required to write it and, as a result of that discipline, how it rewards you with extremely high quality software. It compiles to really quick machine code, requiring a programmer to understand the hardware rather than to be someone who only deals in expressing business logic. I’ve always been fascinated with Operating Systems and the crucial services they provide. My post regarding my toy OS Farmix may convince you of this. I think that is the final career goal for me. To be a kernel developer.

Further to requiring you to understand the hardware it also requires you to understand data structures and algorithms and when you use those skills C++ rewards you with high quality software you can be proud of. C++11 and shared pointers actually allow your code to look like Java, where you “new” things at the top of a function and don’t concern yourself with deleting them at the end. A little bit of portability fore-thought and an eye for undefined behaviour and you write software that mitigates the need for the JVM and overtakes a language created to cure it of its own flaws. A language that provides rich enough Object Orientation that it is no further from expressing business logic than Java, Perl or Python.

A year of commercial Perl experience and two and half of professional Python experience have taught me one of the benefits of those languages, especially in terms of writing it quickly, is how people uses hashes as lightweight objects. You always seem to see it a lot. C++’s new “Initialiser List” feature makes creating hashes in C++ just as simple. You can have Python style Tuples as well, and Lambdas and Closures too, even though I’ll admit I find the syntax for those last ones are bit more complex.

I mean no disrespect to Perl what so ever. It’s a great language. It works and the company I’ve come from prove it. Forgive me if I feel the need the need to be defensive. The developers I’ve met in the Perl community are excellent too. We’re all different and my “fixation” isn’t the one true vision of the world. It’s only mine and I’d never look down on someone who doesn’t have the crazy viewpoint I can’t seem to let go of. I consider the developers I’ve met as friends and excellent at their job and I’m just following my own path. This post is not even designed to encourage people to take the same stance as me, only really to highlight in the broader sense that we’re all different and we all see the world in different ways. Maybe I’m an idiot for leaving this job and only time will tell.

Balance in Counterstrike

The word “Balance” comes up in discussions around Counterstrike every day. What is balance and why is it important? To many it is such an abstract concept they don’t even know where to start. In this blog post, I’m going to attempt to provide a baseline for discussion on the subject.

Counterstrike is supposed to be a skill based game. The more skilled you are, either mechanically through quick reactions or mentally through learning strats and being adaptive, the more consistently you should be able to win games.

A typical Counterstrike game, consists of two teams playing 30 rounds. You would expect more skilled team to win the most rounds. Balance is a measure of how finely tuned the skill difference needs to be for the more skilled team to emerge victorious.

This is my personal interpretation.

Let’s say for example we have a map that favours the CT team, such that they always win 16-0. That means every game is a draw. The more skilled team would not win and their skill would not be apparent. This defeats the purpose of Counterstrike as a skill based game. Everyone is the same skill, even if they are not. Counterstrike should be aiming to measure skill as finely as possible to reward better players the most. With 30 rounds a game, a slightly skilled team should take an extra round (16-14) and deeply different skill levels could be reflected by the 16-0.

Every player in Counterstrike Matchmaking has a unique numeric score (sort-of) that represents their skill level. Each score or player sits inside a bucket (or range of scores) called a rank. We have 15 ranks from Silver I to Global Elite. If we had too many ranks, people would move up and down too erratically. We would question their true skill. If we had too few ranks, then people’s skills wouldn’t be reflected at all and each matchmaking game would be effectively random as the system doesn’t know what even teams look like.

In a game of counterstrike, the difference in the number of rounds you win by, 1 to 16 should be a measure of your skill against the other team. In the same vane as the previous paragraph, if the games are always close, we learn nothing of who is more skilled. If too varied then people have little confidence in the results being anything other than “general day to day randomness”.

Balance is the ingredient into a game that selects how much skill a team needs to win a round.

I said “maps” can be balanced or unbalanced but Counterstrike has many constructs that control balance. They include:

  • How many entrances to a bomb sites there are impacts how many players are required to hold it, or what strategies are required to hold it and whether it’s CT or T sided. How many angles a T has to clear.
  • How many cubby holes are around to provide CTs with hide-and-seek or one-and-done spots.
  • How many avenues the CT team have to retake a bomb site. Do they have back passages that simplify retakes?
  • Are the skyboxes open?
  • CT weapons are more expensive that their T equivalents. (e.g. M4 = $3100, AK $2700)
  • CTs must typically buy a defuse kit ($400) and it’s common to “double-eco” on CT side, which you don’t need to do on T side. Especially if you can develop a strat to “just get a bomb plant”.
  • The T’s have the tec-9 to run with. The CTs have the 5-7 to stand still with.
  • How long it takes the CTs to rotate between the bomb sites impacts how T/CT sided the map is or how viable retakes are.
  • The Ts have an advantage that their AK is a one-hit kill to the head. The CT requires a head-shot and a body shot, favouring the Ts.
  • How many angles on a bomb site to clear, how many effective after plant spots. For example, you can watch a bomb on Mirage from short on B site.
  • How long or short ranged the weapons are. Is the Deagle worth the $700 price tag etc

There are many more examples. Balance is all about tuning the number of rounds that separate slightly more skilled or heavily more skilled teams. This is always going to be a difficult feat as day-to-day people’s performances change. Their chemistry with a team can change day to day. You can have a bad day. As soon as someone finds a trick that’s 75% effective and exploits it, others change their behaviours to adapt and counter it. This is the games “meta” evolving and these changes in the way people play counterstrike over time can also work against the fine balancing work put in to maps, weapons and other things.

One point of contention, especially recently is that a fully bought team should have the edge over players just using pistols. The balance is in their favour. However many teams are finding themselves losing to force buys and half-buys suggesting weapon balance still needs work.

With the constantly evolving meta the question of balance will never be over.

Should I go to University if I want to become a computer programmer?

After college, everyone has the choice to go to university and get a degree in computer programming or to go straight into the field. Here are the reasons why I support going to university.

University is an environment that is based with the sole objective of helping you learn to be an expert in something you care about. You spent three years studying the subject full time. Your learning objectives are selected by experts to ensure your understanding is broad, deep and important. There are lecturers whose job is to ensure you fully understand the material. They read what you write, understand your mentality and not just your results. They can correct small errors or misunderstandings in your thinking. They give you a chance to learn the building blocks your decision making is based upon. They help you develop the critical awareness skills you need to be successful.

On the job learning is possible but with an actual job to do, even if programming related, there will be no time to expose you to the wide breath of computer programming as a field. You will be doing something specific and limited in scope and will be potentially too busy to understand what’s going on at the lower levels. Your colleges, whilst smart and educated are also busy themselves and cannot commit themselves as fully to helping you.

University is free of the business constraints that impact software design and development. With no deadlines and being able to write summaries in essays about how you messed up but what you should have done, university provides feedback on your understandings that businesses simply can’t match.

There are many many important things you learn about software development on the job you cannot learn at university, especially about teamwork, delivering customer value, trade-offs and appropriately hacking things to meet deadlines. The best programmers have a degree and this rich experience under their belt. Skipping university only to meet a graduate who knows less than you on day one may solidify an opinion that somehow university is useless but this is simply incorrect in my experience and in the medium and long term, university graduates are better at writing software than the non-degree educated ones.

Software is constantly evolving and new technology is always coming out. Everyone has to learn new things and everyone has to learn from books and reading things on the Internet. Even those at or post University. Reading from books can be effective but to reiterate, without a solid base of understanding the fundamentals, for some, reading is not as effective as you’d think. I notice particularly that non-degree educated programmers are bad at writing object orientated programs correctly. They don’t choose models based on the domain effectively. Their limited interaction with software design documentation, typically absent from most companies, leads to overly complicated or brittle approaches. Their lack of mentoring and real feedback outside of trivial code reviews leads to the adoption of bad practices and creates a Dunning–Kruger effect.

This is all purely my opinion but I do have ten years experience in field after my degree and I have worked with a mix of degree and non-degree educated developers.

Let me also reiterate that University is a very fun experience, especially for young adults so why rush ahead with your life. As boring as school or college is, University is a new and fun experience all together.

The appeal of Counterstrike: Global Offensive

I’m going to attempt to explain the appeal and popularity of Counterstrike: Global Offensive and its niche within the wider collection of first person shooters. Counterstrike: Global Offensive has roughly 11 million monthly players, (excluding Asia) and typically reaches 500,000 concurrent players each day. I can’t speak on behalf of the 11 million but I’m sure their reasons overlap with mine. I’ve have been playing Counterstrike for 2 years now.

Continue reading “The appeal of Counterstrike: Global Offensive”

Why I have a blog

I feel as if staying current with the latest technology is a difficult but necessary requirement for a computer programmer.

You have to know what new tools can speed up your development, what methodologies or practices reduce risk, and what good ideas underpin certain new products, likely destined to fail.

Staying up to date is difficult given the quantity of new tech emerging each day.

You can start by simply browsing tech sites in your lunch break. After reading a lot of content you eventually stop wanting to take these news sites’ word at face value. Community discussion sites such as Reddit where the community can share ideas and a reaction to new tech can really help you understand those technologies better.

News and Community discussion sites are great but you never really control and start the conversations on subjects that matter to you until you create your own blog site to make it so.

So that’s what this site is. A scratching post for my thoughts and way for me to lead conversations I wish to have. To share what I think is interesting.

There are other benefits for me too. I can work on my own writing skills which I feel is absolutely critical for a good software developer.

Writing a post also helps me arrange my thoughts on subjects too. It helps me summarise and think objectively about the topic. The ability to explain something well to others is often considered a proof of a person’s understanding.

I hope you enjoy my blog and start your own too!

Welcome to my blog

Hello and welcome!

I’ve hosted this blog for around 5 years although I finally ported it from a homemade html-template based mess to a dockerised WordPress site. This should allow me to update and create content, especially with images must more easily. Please bare with me as I port the content across. I aim to rewrite much of it as I feel my writing style has improved and this is why the site is currently quite baron.

Welcome again!

Any feedback you wish to give, you can email me at blog @philliptaylor .net