I recently attended a group meet. The group is a pack of programmers from around the county that meet up every month and discuss issues and industry and so on. Each meet they decide on a small project together and work through it. This project can be anything from Programming Kata ideas to a full blown development project.
This appealed to me right from the start. It's a chance to associate with people in the industry, do a little networking and maybe learn a little something. The meet isn't that far from me a few of my lecturers attend and have been encouraging me to, so I decided to go.
I can honestly say that I've never felt so intellectually inferior in my life. Some of these guys are the people that the people I look up to, look up to. Every time I spoke up I regretted it almost instantly. My input was lagging and often needless, responded to with blank stares and patient slowly spoken sentences. I'm pretty sure that everyone in the room actually started dumbing down the language toward the end.
One of the highlights of the evening was when a team member from a company that had recently declined me for a placement came in. This team member then proceeded to talk about the poor quality of programmers they have had applying this year, my interview was even brought up as one such example.
By the end of the night I was drained and depressed. I felt like such an ameteur and well, like an idiot. Unworthy of referring to myself as a member of their industry.
I'm going to keep attending. I'm aware that I'm naturally very paranoid and have never been very good with those types of situations. I'd like to think that soon I'll do better and that's not going to happen if I run away screaming due to my own insecurities. I am just a student after all and all of these guys are seasoned veterans. They all seemed like genuine, nice, very smart people and I think in the long run it will be good for me on a number of levels. In fact, I learned a lot while I was there. I'm a big believer that if you truly want to get better at anything, spending as much time as possible with the masters is the best way. Coming away from the meeting feeling 2 inches tall is just an indication that I've still got a lot to learn. I'm going to be coming home from the meets with a lot of homework for quite a while.
I'm dyslexic. Apparently as many as 1 in 5 people are. This blog is about my experience with the condition as a student and a programmer. I am not a teacher, therapist, educational psychologist or any sort of medical professional. This is in no way medical advice. I'm just a student trying to learn whilst dealing with this condition.
Showing posts with label Development. Show all posts
Showing posts with label Development. Show all posts
Monday, 11 March 2013
Monday, 18 February 2013
Kata 3 - Magic Numbers
This kata comes from the website of one of my old lecturers. It was an interesting problems to tackle and there are a lot of different ways to approach it.
159 * 48 = 7632 contains each of the numbers 1-9. The program finds and displays all the other simple multiplications that also contain each of the numbers 1-9.
I started by creating an algorithm that generated a string containing all the numbers I wanted. This was exceptionally tricky to do. So my algorithm just starts counting from 123456789. Each number is checked that it contains only one of each number. Because I'm using only 9 digit numbers there isn't any need to validate any further than that. If the number is valid it's passed through to another checker that systematically changes the number into a simple multiplication equation. If the equation is valid I win.
The application takes a ridiculously long time to run. After completion I thought of a way to potentially half the run time but I didn't implement it because I've been obsessing about this for far too long.
This was done largely using TDD but I actually wrote the test in Obj C and then transferred the program to C# because of a memory problem I was having in XCode.
159 * 48 = 7632 contains each of the numbers 1-9. The program finds and displays all the other simple multiplications that also contain each of the numbers 1-9.
I started by creating an algorithm that generated a string containing all the numbers I wanted. This was exceptionally tricky to do. So my algorithm just starts counting from 123456789. Each number is checked that it contains only one of each number. Because I'm using only 9 digit numbers there isn't any need to validate any further than that. If the number is valid it's passed through to another checker that systematically changes the number into a simple multiplication equation. If the equation is valid I win.
The application takes a ridiculously long time to run. After completion I thought of a way to potentially half the run time but I didn't implement it because I've been obsessing about this for far too long.
This was done largely using TDD but I actually wrote the test in Obj C and then transferred the program to C# because of a memory problem I was having in XCode.
static void Main(string[] args)
{
string equationString;
List<string> createdStrings = new List<string>();
//create an array of strings ///159 * 48 = 7632
for (int i = 123456789; i <= 987654321; i++){
equationString = i.ToString();
//validate strings with the checker
if (equationCharacterChecker(equationString)){
if (equationChecker(equationString)){
createdStrings.Add(equationString);
}
}
}
}
public static bool equationCharacterChecker(string equation) {
SortedSet<string> setOfEquationCharacters = new SortedSet<string>();
setOfEquationCharacters.Add("1"); setOfEquationCharacters.Add("2"); setOfEquationCharacters.Add("3");
setOfEquationCharacters.Add("4"); setOfEquationCharacters.Add("5"); setOfEquationCharacters.Add("6");
setOfEquationCharacters.Add("7"); setOfEquationCharacters.Add("8"); setOfEquationCharacters.Add("9");
string character;
for (int i = 0; i < equation.Count(); i++)
{
character = equation[i].ToString();
if (setOfEquationCharacters.Contains(character)){
setOfEquationCharacters.Remove(character);
} else {
return false;
}
}
return true;
}
//159 * 48 = 7632
public static bool equationChecker(string equation) {
int length = equation.Length;
for (int m = 1; m < equation.Length-2; m++){
for (int e = m+1; e < equation.Length-1; e++){
int multiplicand = Convert.ToInt32(equation.Substring(0, m));
int multiplier = Convert.ToInt32(equation.Substring(m, e-m));
int product = Convert.ToInt32(equation.Substring(e));
if (multiplicand * multiplier == product) {
Console.Write(multiplicand + " * " + multiplier + " = " + product + "\n");
return true;
}
}
}
return false;
}
Monday, 11 February 2013
Kata2 Binary Search
I did my second Kata this morning. I thought I'd tackle the binary search problem in following with http://codekata.pragprog.com
The idea here is that you have some huge, but sorted, list and you need to find a single element within that list as efficiently as possible. As lists grow in size just traversing through the list element by element can take a really long time for higher numbers.
The binary search solution basically means you start in the middle continually divide the list in half until you find your element. For huge lists it's excellent because it doesn't matter where the desired element is in the list, it will always find it quickly, one drawback though it will more often than not, take several searches to locate the element. So you need to weigh the efficiency lost against the efficiency gained.
The binary search solution basically means you start in the middle continually divide the list in half until you find your element. For huge lists it's excellent because it doesn't matter where the desired element is in the list, it will always find it quickly, one drawback though it will more often than not, take several searches to locate the element. So you need to weigh the efficiency lost against the efficiency gained.
I'm quite proud of my attempt. I've tested it with a list of 50,000,000 integers and it never takes more than 26 searches to find any element. It'll support an array of any size and it should support any data type, but I'll need to test that at a later time. This is a recursive approach as it was the approach that comes most naturally to me. I'm going to have a look at an iterative at a later time.
This was developed using TDD, kind of. I had to test this from a few different directions at once, namely efficiency and accuracy. I couldn't work out a good way of testing for them both at the same time so I'm leaving what test code I did end up with out of this post.
This was developed using TDD, kind of. I had to test this from a few different directions at once, namely efficiency and accuracy. I couldn't work out a good way of testing for them both at the same time so I'm leaving what test code I did end up with out of this post.
-(NSNumber*)binarySearch:(NSArray*)array forInt:(NSNumber*)anInt {
int numberOfSearches = 1;
int min = 0;
int max = array.count;
int searchingFor = [anInt integerValue];
int indexOfGuess = [array indexOfObject:[array objectAtIndex:(max + min) / 2]];
int guess = [[array objectAtIndex:indexOfGuess] integerValue];
NSLog(@"%d searches", numberOfSearches);
while (searchingFor != guess){
if (max - min <= 2){
return [NSNumber numberWithInt:-1];
}
if (searchingFor < guess){
max = indexOfGuess;
}
if (searchingFor > guess){
min = indexOfGuess;
}
guess = [[array objectAtIndex:(max + min) / 2] integerValue];
indexOfGuess = [array indexOfObject:[array objectAtIndex:(max + min) / 2]];
numberOfSearches++;
NSLog(@"%d searches", numberOfSearches);
}
return [NSNumber numberWithInt:indexOfGuess];
}
Monday, 4 February 2013
Bruising the Ego
I've learned quite about managing your ego when it comes to development. Every programmer has an ego, don't listen to what they might tell you otherwise. We all consider ourselves the poets of the computing world, thinking up beautifully elegant solutions to impossible problems.
I have a huge ego, I freely admit this. I don't handle criticism well and I'm a sore loser. I constantly aim to blow peoples minds with my genius and when that doesn't happen I fall into pits of self loathing and depression. It's a constant struggle for me.
Two of my apps have received bad reviews recently. I've got another app that I'd written for a client that seems to have given up on me all together, bought my app and immediately reporting a bug and requesting all sorts of changes. I fixed the bug right away and then spent a month re-writing the app. Now they won't respond to my emails, nor have they updated the app. My natural pessimism tells me that they've written me off all together, but I just don't know.
Being that two people have chosen to be vocal about their dislike of my apps, demographically I know that there are a percentage of others out there that feel the same way and have just chosen not to speak up. I spent a lot of time and energy on those apps and I'm very proud of them and their success so far. These were my ideas, my creations, my products and I want everyone to love them.
Now in my defence neither of these two users appear to have read the description of the apps before purchasing, which is their mistake. And the things they're complaining about are actually restrictions put in place by Apple, nothing to do with me. But these are still my app reviews. There is also information within the apps and on the app store that would allow a displeased customer to get in touch with me of there's a problem. But they haven't tried to reach me. I take some solace in knowing, from experience, that there are customers out there that just want to complain about anything that they can. You can't please everyone right, so why don't all those that like my apps post good reviews and make me feel better about it. I'm sat here looking at dissatisfied customers and poor reviews and I'm powerless to do anything about it.
I suppose that I could look at it as there's being an opposing percentage of those that are very happy with my app. There is one good review as well, so that's something.
I have a huge ego, I freely admit this. I don't handle criticism well and I'm a sore loser. I constantly aim to blow peoples minds with my genius and when that doesn't happen I fall into pits of self loathing and depression. It's a constant struggle for me.
Two of my apps have received bad reviews recently. I've got another app that I'd written for a client that seems to have given up on me all together, bought my app and immediately reporting a bug and requesting all sorts of changes. I fixed the bug right away and then spent a month re-writing the app. Now they won't respond to my emails, nor have they updated the app. My natural pessimism tells me that they've written me off all together, but I just don't know.
Being that two people have chosen to be vocal about their dislike of my apps, demographically I know that there are a percentage of others out there that feel the same way and have just chosen not to speak up. I spent a lot of time and energy on those apps and I'm very proud of them and their success so far. These were my ideas, my creations, my products and I want everyone to love them.
Now in my defence neither of these two users appear to have read the description of the apps before purchasing, which is their mistake. And the things they're complaining about are actually restrictions put in place by Apple, nothing to do with me. But these are still my app reviews. There is also information within the apps and on the app store that would allow a displeased customer to get in touch with me of there's a problem. But they haven't tried to reach me. I take some solace in knowing, from experience, that there are customers out there that just want to complain about anything that they can. You can't please everyone right, so why don't all those that like my apps post good reviews and make me feel better about it. I'm sat here looking at dissatisfied customers and poor reviews and I'm powerless to do anything about it.
I suppose that I could look at it as there's being an opposing percentage of those that are very happy with my app. There is one good review as well, so that's something.
Monday, 28 January 2013
Being The Boss.
21-01-13
I've got a module this semester where in, we're to work as small games companies. It's straight forward enough, the class of 30ish students has been split into two teams of ten and we're using the Cry engine and Scrum to create one prototype game each. The game has to be a FPS zombie killing game, multiplayer optional.
Now, in that we're supposed be working as a games company we were all to be given roles based on skills and personal preference. These roles were to be given out by the company producer, an elected executive type role, basically the producer is the guy in charge. This role has real power in the module, they manage the team, make all the final decisions about the game and if necessary, discipline team members. The producer can actually have members of his team kicked off the module if it's deemed necessary.
I'd put my name in for producer. Thinking that, if I got it, it would be good experience relating to my plans after graduation, I also thought it would be nice if I was actually put in charge of a project by my peers instead of just assuming the role.
The campaign was short, we stood in front of the class and presented our fitness for candidacy for 2 minutes each. I'm not well known at the university and I don't even think I'm well liked, I have a habit of winding up total strangers and openly mocking design students, many of whom were on that module. I screwed up my 'speech' delivery pretty royally and made myself look a real idiot. But when the votes came in I (having snuck a peek at the count) was on top... oh... goodie.
So now, here I am leading one of three teams in making a game from the ground up. We're using a commercial grade engine so it's not nearly as much work as it sounds, but there's still an awful lot to do, especially for me. I've got 10 other students relying on me to get a good grade in this module, I've got to manage their time, their tasks and the quality of their work. I've got to organise and lead regular meetings, orchestrate documentation and be held accountable for any and all the problems. I've also got to track it all and report on it. I have a lead artist, designer, tools developer, scripter and 6 team members assigned to various areas. In all I have 2 game designers and 8+ programmers, I'm still waiting for a couple a stragglers to be assigned to my team. All looking to me for decisive guidance and support...
What have I gotten myself in to?
I've got a module this semester where in, we're to work as small games companies. It's straight forward enough, the class of 30ish students has been split into two teams of ten and we're using the Cry engine and Scrum to create one prototype game each. The game has to be a FPS zombie killing game, multiplayer optional.
Now, in that we're supposed be working as a games company we were all to be given roles based on skills and personal preference. These roles were to be given out by the company producer, an elected executive type role, basically the producer is the guy in charge. This role has real power in the module, they manage the team, make all the final decisions about the game and if necessary, discipline team members. The producer can actually have members of his team kicked off the module if it's deemed necessary.
I'd put my name in for producer. Thinking that, if I got it, it would be good experience relating to my plans after graduation, I also thought it would be nice if I was actually put in charge of a project by my peers instead of just assuming the role.
The campaign was short, we stood in front of the class and presented our fitness for candidacy for 2 minutes each. I'm not well known at the university and I don't even think I'm well liked, I have a habit of winding up total strangers and openly mocking design students, many of whom were on that module. I screwed up my 'speech' delivery pretty royally and made myself look a real idiot. But when the votes came in I (having snuck a peek at the count) was on top... oh... goodie.
So now, here I am leading one of three teams in making a game from the ground up. We're using a commercial grade engine so it's not nearly as much work as it sounds, but there's still an awful lot to do, especially for me. I've got 10 other students relying on me to get a good grade in this module, I've got to manage their time, their tasks and the quality of their work. I've got to organise and lead regular meetings, orchestrate documentation and be held accountable for any and all the problems. I've also got to track it all and report on it. I have a lead artist, designer, tools developer, scripter and 6 team members assigned to various areas. In all I have 2 game designers and 8+ programmers, I'm still waiting for a couple a stragglers to be assigned to my team. All looking to me for decisive guidance and support...
What have I gotten myself in to?
Monday, 21 January 2013
My First TDD Kata - Objective C - Xcode 4.5 - OCUnit - ARC
Ok, so I've taken the entire day to work on a programming Kata using TDD.
I started with the same exercise that I was given during an interview for an industrial placement a few weeks ago http://codekata.pragprog.com/2007/01/code_kata_one_s.html just so that I had an idea of where to start.
This code has taken me all day but for good reason.
Firstly I've never used TDD before, nor do I have any idea of how to use OCUnit. I have quite limited experience in programming generally so this was all a bit of a learning curve for me.
Secondly, this paradigm is basically the opposite of the way in which I've learned to program. I find it very, very difficult to think this way.
I'm actually quite pleased with the result. As applications go it's functional, seems robust and the design isn't far off from what I would have designed otherwise. It will be interesting to come back to this Kata later and see what differences there are.
What did I learn?
TDD is a concept, I could hear the criticisms screaming out at me as I did it but once I got going it actually started to come really naturally.
Two problems.
From time to time a tricky change comes up. For example in my application I made the decision to change from scanning in Strings to scanning in item objects. Looking back now I can see how I maybe could have handled this differently and maybe made things a little bit easier on myself. But still there was a lot of time spend pondering this, while outside of TDD the change would have been a no-brainer, just change an argument here and a return type there an done. TDD meant that I wound up writing a whole new function for it to save failing the older tests. I'm hoping that some more practice in TDD will help me to handle this type of situation in the future.
There was a real sense of fragility when programming. When implementing the BOGOF feature I found myself tip-toeing around the code trying to change as little as possible as not to fail my older tests, again I hope that experience will take care of this but I'm not so sure.
The design comes from the refactoring stage really. Refactoring seems to be the time to do a little bit of 'Crystal Balling' a little bit and try to introduce some good code and design practices.
Oh and if you're wondering about the weird way I've worked with NSNumber, well I can't really explain myself, I just had a really hard time with it and the primitives. I may do my next kata in a different language.
My Code.
Tests
Application
I started with the same exercise that I was given during an interview for an industrial placement a few weeks ago http://codekata.pragprog.com/2007/01/code_kata_one_s.html just so that I had an idea of where to start.
This code has taken me all day but for good reason.
Firstly I've never used TDD before, nor do I have any idea of how to use OCUnit. I have quite limited experience in programming generally so this was all a bit of a learning curve for me.
Secondly, this paradigm is basically the opposite of the way in which I've learned to program. I find it very, very difficult to think this way.
I'm actually quite pleased with the result. As applications go it's functional, seems robust and the design isn't far off from what I would have designed otherwise. It will be interesting to come back to this Kata later and see what differences there are.
What did I learn?
TDD is a concept, I could hear the criticisms screaming out at me as I did it but once I got going it actually started to come really naturally.
Two problems.
From time to time a tricky change comes up. For example in my application I made the decision to change from scanning in Strings to scanning in item objects. Looking back now I can see how I maybe could have handled this differently and maybe made things a little bit easier on myself. But still there was a lot of time spend pondering this, while outside of TDD the change would have been a no-brainer, just change an argument here and a return type there an done. TDD meant that I wound up writing a whole new function for it to save failing the older tests. I'm hoping that some more practice in TDD will help me to handle this type of situation in the future.
There was a real sense of fragility when programming. When implementing the BOGOF feature I found myself tip-toeing around the code trying to change as little as possible as not to fail my older tests, again I hope that experience will take care of this but I'm not so sure.
The design comes from the refactoring stage really. Refactoring seems to be the time to do a little bit of 'Crystal Balling' a little bit and try to introduce some good code and design practices.
Oh and if you're wondering about the weird way I've worked with NSNumber, well I can't really explain myself, I just had a really hard time with it and the primitives. I may do my next kata in a different language.
My Code.
Tests
-(void)testCheckOut {
NSNumber *expected = [NSNumber numberWithDouble:0.0];
NSNumber *result = [scanner checkOut];
STAssertEquals([expected doubleValue], [result doubleValue], @"Expected %g, but returned %g", [expected doubleValue], [result doubleValue]);
}
-(void)testScanItem {
NSNumber *expected = [NSNumber numberWithDouble:0.60];
[scanner scanItem:(@"apple")];
NSNumber *result = [scanner checkOut];
STAssertEquals([expected doubleValue], [result doubleValue], @"Expected %g, but returned %g", [expected doubleValue], [result doubleValue]);
}
-(void)testScanningTwoItems {
NSNumber *expected = [NSNumber numberWithDouble:1.20];
[scanner scanItem:(@"apple")];
[scanner scanItem:(@"apple")];
NSNumber *result = [scanner checkOut];
STAssertEquals([expected doubleValue], [result doubleValue], @"Expected %g, but returned %g", [expected doubleValue], [result doubleValue]);
}
-(void)testScanningAnItemWithADifferentPrice{
double expected = 0.7;
[scanner scanItem:@"banana"];
double result = [[scanner checkOut] doubleValue];
STAssertEquals(expected, result, @"Expected %g, but returned %g", expected, result);
}
-(void)testScanningTwoItemsWithDifferentPrices {
double expected = 0.7+0.6;
[scanner scanItem:@"apple"];
[scanner scanItem:@"banana"];
double result = [[scanner checkOut] doubleValue];
STAssertEquals(expected, result, @"Expected %g, but returned %g", expected, result);
}
-(void)testScanningMultipleItemsObjectsOfVaryingPrice {
Item* apple = [[Item alloc] initWithDescription:@"apple" andPrice:[NSNumber numberWithDouble:0.6]];
Item* banana = [[Item alloc] initWithDescription:@"banana" andPrice:[NSNumber numberWithDouble:0.7]];
Item* orange = [[Item alloc] initWithDescription:@"orange" andPrice:[NSNumber numberWithDouble:0.5]];
double expected = 0.0;
[scanner scanItem:apple.description];
expected += [apple.price doubleValue];
[scanner scanItem:banana.description];
expected += [banana.price doubleValue];
[scanner scanItem:orange.description];
expected += [orange.price doubleValue];
[scanner scanItem:apple.description];
expected += [apple.price doubleValue];
double result = [[scanner checkOut] doubleValue];
STAssertEquals(expected, result, @"Expected %g, but returned %g", expected, result);
}
-(void)testScanningItemAsObject {
Item* apple = [[Item alloc] initWithDescription:@"apple" andPrice:[NSNumber numberWithDouble:0.6]];
double expected = 0.6;
[scanner scanObject:apple];
double result = [[scanner checkOut] doubleValue];
STAssertEquals(expected, result, @"Expected %g, but returned %g", expected, result);
}
-(void)testScanningMultipleObjects {
Item* apple = [[Item alloc] initWithDescription:@"apple" andPrice:[NSNumber numberWithDouble:0.6]];
Item* banana = [[Item alloc] initWithDescription:@"banana" andPrice:[NSNumber numberWithDouble:0.7]];
double expected = apple.price.doubleValue + banana.price.doubleValue;
[scanner scanObject:apple];
[scanner scanObject:banana];
double result = [[scanner checkOut] doubleValue];
STAssertEquals(expected, result, @"Expected %g, but returned %g", expected, result);
}
-(void)testBOGOFWithTwoOfTheSameItem {
Item* apple = [[Item alloc] initWithDescription:@"apple" andPrice:[NSNumber numberWithDouble:0.6]];
double expected = apple.price.doubleValue;
[scanner scanObject:apple];
[scanner scanObject:apple];
double result = [[scanner checkOut] doubleValue];
STAssertEquals(expected, result, @"Expected %g, but returned %g", expected, result);
}
-(void)testBOGOFWithMultipleVaryingItems {
Item* apple = [[Item alloc] initWithDescription:@"apple" andPrice:[NSNumber numberWithDouble:0.6]];
Item* banana = [[Item alloc] initWithDescription:@"banana" andPrice:[NSNumber numberWithDouble:0.7]];
double expected = 0.0;
[scanner scanObject:apple];
expected += apple.price.doubleValue;
[scanner scanObject:apple];
[scanner scanObject:banana];
expected += banana.price.doubleValue;
[scanner scanObject:banana];
[scanner scanObject:banana];
expected += banana.price.doubleValue;
double result = [[scanner checkOut] doubleValue];
STAssertEquals(expected, result, @"Expected %g, but returned %g", expected, result);
}
Application
-(PriceScanner*)init {
self.total = [NSNumber numberWithDouble:0.0];
self.list = [[NSMutableArray alloc] init];
return self;
}
-(void)scanObject:(Item*)item {
[self.list addObject:item];
}
-(void)scanItem:(NSString*)item {
if ([item isEqualToString:@"apple"]){
self.total = [NSNumber numberWithDouble:[self.total doubleValue] + 0.6];
}
if ([item isEqualToString:@"banana"]){
self.total = [NSNumber numberWithDouble:[self.total doubleValue] + 0.7];
}
if ([item isEqualToString:@"orange"]){
self.total = [NSNumber numberWithDouble:[self.total doubleValue] + 0.5];
}
}
-(void)applyBOGOF{
double newTotal = [self.total doubleValue];
NSMutableSet *tempSet = [[NSMutableSet alloc] init];
for (Item* i in self.list){
if ([tempSet containsObject:i.description]){
newTotal -= [i.price doubleValue];
[tempSet removeObject:i.description];
} else {
[tempSet addObject:i.description];
}
}
self.total = [NSNumber numberWithDouble:newTotal];
}
-(NSNumber*)checkOut {
double newTotal = [self.total doubleValue];
for (Item* i in self.list){
newTotal += i.price.doubleValue;
}
self.total = [NSNumber numberWithDouble:newTotal];
[self applyBOGOF];
return self.total;
}
Tuesday, 15 January 2013
Test Driven Development: Prologue.
I'm putting down, for the record, that I'm going to endeavour to do more testing in my software. I plan to do this by means of Test Driven Development. While I plan to do as much work as possible in Xcode probably using GHUnit or OCUnit, visual studio is proving inescapable so I'll probably be using NUnit as well.
What I already know.
I went for an interview for an industrial placement at a software company that uses Extreme Erogramming with TDD for all of their software. Now, I'm a big fan of XP and this has proven hugely successful for this company so I paid attention to their processes.
This approach gets a lot of criticism from people saying that it promotes bad design, or poorly written code. But the idea behind TDD is that you're focussing on a single problem at a time. So when you start, yeah you have a bunch of really inflexible code and virtually no design in place. But as the number of tests grows and likewise the application, better design falls right into place and you end up with a very robust piece of software.
Anyway, I'll see how I get on. It may be a bit naive of me to just be saying All my products will be TDD from now on but I'm going to give it a go and see how far I get.
What I already know.
I went for an interview for an industrial placement at a software company that uses Extreme Erogramming with TDD for all of their software. Now, I'm a big fan of XP and this has proven hugely successful for this company so I paid attention to their processes.
- Write the test. Make sure you give it a name that describes what the test is for.
- Fail the test. This was really important, especially as the application starts to grow, because new tests won't always fail, but they should. If you skip this step you can end up wasting a lot of time trying to fix a problem that isn't there.
- Get the test to pass as quickly as possible. This is also very important because it stops you spending hours trying to implement the most ideal solution and losing scope of what you're trying to do. Literally just throw in whatever you can to get that test to pass.
- Refactor. Make it look nice, now is that time to maybe think about the ideal implementation, but not too much.
This approach gets a lot of criticism from people saying that it promotes bad design, or poorly written code. But the idea behind TDD is that you're focussing on a single problem at a time. So when you start, yeah you have a bunch of really inflexible code and virtually no design in place. But as the number of tests grows and likewise the application, better design falls right into place and you end up with a very robust piece of software.
Anyway, I'll see how I get on. It may be a bit naive of me to just be saying All my products will be TDD from now on but I'm going to give it a go and see how far I get.
Monday, 17 December 2012
Open-Source.
I've decided that I'm going to embark on some sort of open-source project. This is a world that I have great respect for as a lot of really cool things have resulted from it.
The only problem is that I don't have a clue what I would want to do for it. I thought about trying to create a game engine of some sort, but I think that's a little ambitious. And there's already a lot of really great open source engines out there that I'd really only be copying.
So while I think about, I put it to the world. Or those that read this blog anyway. What sort of open-source project should I go for.
Labels:
Development,
open,
programming,
project,
source
Subscribe to:
Posts (Atom)