Ask for help, not for data

Sometime ago I received an email asking for confirmation about an event about to take place. Included in the email was a little snippet meant to make it fun and attractive to developers. As many of us read through it, it brought several opinions on the quality of the code. Here’s the thing:

if (employee.WantsToAttend()) {
	if (employee.IsWorkingFromOffice1())
	{         employee.reply(manager1, "I wanna be there");     }
	else if (employee.IsWorkingFromOffice2())
	{         employee.reply(manager2, "Dude! I wanna be there!");      }
}

I realize that this code is meant to express the idea of the invitation. But the sad thing is that you can find this kind of code on production software. Oh? what’s wrong with this code you said? well, let’s talk it out.

Tenets of OOP

We’ve all heard about the oop principles: encapsulation, polymorphism, inheritance and abstraction. Let’s evaluate the code in the context of these.

Encapsulation

Encapsulation states that you must hide the object internals in such a way that if you change them no dependent object should be afected.

Now consider this method calls:

employee.WantsToAttend()
employee.IsWorkingFromOffice1()
employee.reply(manager1, "I wanna be there");

These calls are all implementation details of the “confirm assistance” scenario. Truth is we only care the employee object to confirm it’s assistance. We could easily move the first evaluation into the object:

class Employee
{
   ...
   public void ConfirmAssistance(string manager, string msg)
   {
      if(wantsToAttend())
		reply(manager,msg);
   }
}

Now the client code would look a little more cleaner:

if (employee.IsWorkingFromOffice1())
	    employee.ConfirmAssistance(manager1, "I wanna be there");     
	else if (employee.IsWorkingFromOffice2())
	    employee.ConfirmAssistance(manager2, "Dude! I wanna be there!"); 

So far so good. We’re now hiding the data by making the decision inside the object. However there is a subtle but important implication: we shift the responsibility of validating wheter the customer wants to assist to an event from the client code to the object. From now on you don’t need to figure out if the employee wants to attend everytime you want to confirm his assistance. The object will do it itself.

Allen Holub calls this asking an object for help instead of data. This is a direct consequence of encapsulation and probably the most influential piece of advice in my transition from a data driven mindset to an OOP one.

Can we stop exposing the employee’s office? we can try:

class Employee
{
   ...
   public void ConfirmAssistance(Func<string,string> msgFactory)
   {
      if(wantsToAttend())
		reply(Office.Manager,msgFactory(Office.Id));
   }
}

And so we have a one liner now:

employee.ConfirmAssistance(officeId => officeId == 1?"I wanna be there": "Dude! I wanna be there!");

If you’re confused by the weird syntax it’s just an inline/anonymous function created using a syntax called lambda expressions (the examples are all C#).

Compared to the previous version which one looks more reusable to you?

A few comments here:

1) now we have a msg for office1 and another for the rest (not only office2)

2) we really don’t care how the manager and office id are stored, we can easily change that to private fields and it would not make a difference to the calling code.

Cleaning up the responsibilities

The reply method implies a third party service. Storing a reference to the service it’s overkill. You have to instantiate that service with the rest of the object graph every time you initialize an employee object. Let’s break this down in 2 parts: the reply message creation and the actual sending of that message.

class MessageGateway
{
    Send(Message msg){...}
}

class Message 
{
   public Message(string recipient, string body)
   {
      Recipient = recipient;
      Body = body;      
   }

   public string Recipient {get;set;}
   public string Body {get;set;}
}

class Employee
{
   ...
   public Message ConfirmAssistance(Func<string,string> msgFactory)
   {
      if(wantsToAttend())
		return new Message(Office.Manager,msgFactory(Office.Id));
	  else
	    return null;
   }
}

The client code:

Message reply = employee.ConfirmAssistance(officeId => officeId == 1?"I wanna be there": "Dude! I wanna be there!");    

if(reply != null) new MessageGateway().Send(reply);

We now delegate the reply message creation to the employee object and the sending of it to the message gateway object. Splitting responsibilities like this allows us for better reusing and comply with the Single Responsibility Principle.

But… we’re breaking encapsulation on the Message class.

Let’s fix that.

class MessageGateway
{
    Send(string recipient, string body){...}
}

class Message 
{
   public Message(string recipient, string body)
   {
      Recipient = recipient;
      Body = body;      
   }

    string Recipient;
    string Body;
    
    public SendThrough(MessageGateway gateway)
    {
       gateway.Send(Recipient,Body);
    }
}

class Employee
{
   ...
   public Message ConfirmAssistance(Func<string,string> msgFactory)
   {
      if(wantsToAttend())
		return new Message(Office.Manager,msgFactory(Office.Id));
	  else
	    return null;
   }
}

and the client code looks like:

Message reply = employee.ConfirmAssistance(officeId => officeId == 1?"I wanna be there": "Dude! I wanna be there!");    

if(reply != null) reply.SendThrough(new MessageGateway());

“What?? all the fuzzle for this? just inverting the way we send the data?” Well yeah, but that’s not all. Do you see that null check there? we can now get rid of it.

Polymorphism

There’s this concept that states that the more execution paths are on a program the harder is to maintain. This is called cyclomatic complexity and is a common indicator of code quality. Bottom line is the less “if” and “switch” statements the better.

Our initial approach removed all of the branching statements from the program. But later we introduced a new one with the null check. Let’s remove it. A common OOP technique it’s the null object pattern. It relies on the polymorphism attribute of OOP. Let’s see how it goes.

1) extract a common interface

interface IMessage
{
   SendThrough(MessageGateway gateway);
}

2) create an object that does nothing (as you would if you received a null)

class Message: IMessage
{
   public Message(string recipient, string body)
   {
      Recipient = recipient;
      Body = body;      
   }

    string Recipient;
    string Body;
    
    public SendThrough(MessageGateway gateway)
    {
       gateway.Send(Recipient,Body);
    }

   //usually the null object it's used in a singleton fashion
   class NullMessage: IMessage
   {
	   public SendThrough(MessageGateway gateway) 
	    {
	       //Do nothing :)
	    }
    }

   public static IMessage Null{get;private set;}

   public static Message()
   {
      Null = new NullMessage();
   }
  
}

3) return the null object instead of null

class Employee
{
   ...
   public Message ConfirmAssistance(Func<string,string> msgFactory)
   {
      if(wantsToAttend())
		return new Message(Office.Manager,msgFactory(Office.Id));
	  else
	    return Message.Null;
   }
}

Presto! now let’s update the client code

Message reply = employee.ConfirmAssistance(officeId => officeId == 1?"I wanna be there": "Dude! I wanna be there!");    

reply.SendThrough(new MessageGateway());

look ma! in one line (again)!

employee
	.ConfirmAssistance(officeId => 
	   officeId == 1? "I wanna be there": "Dude! I wanna be there!")   
	.SendThrough(new MessageGateway());

Polymorphism allows us to change a system behavior without changing the code. This is done by creating variations of the same method and swapping them as needed.

If not OOP, then what is it?

Let’s review:

object – data (state)= module (remember vb6?)

object – methods (behavior) = struct (yes, this was already available in C)

You can easily write a program using modules and structs and that’s fine for a lot of situations (forms over data ;))

In conclusion

1) Encapsulation enables Polymorphism

2) Polymorphism enables the use of design patterns and other OOP goodies

OOP shines on making flexible code but it has a price: indirection. If your project is relatively simple (like the example used here) you may want to ponder if there’s a simpler way, like structured programming (modules + structs). But if you still decide on this route, just remember that objects do things. Ask for help, not data!

Extra: a functional twist

Closures can simplify this code a lot. Since they were already present in smalltalk I consider them part of the OOP toolset. Here’s the whole enchilada:

class MessageGateway
{
    Send(string recipient, string body){...}
}

class Employee
{
   ...
   public Message ConfirmAssistance(Action<string,string> confirm)
   {
      if(wantsToAttend())
		confirm(Office.Manager,Office.Id);  
   }
} 

//client code

employee.ConfirmAssistance((manager,officeId)=> {
   var response = officeId == 1? "I wanna be there": "Dude! I wanna be there!";
   new MessageGateway().Send(manager, response);
});

Learn several languages or specialize in one?

I remember a university class when a teacher came and told us that before people tend to generalize: learn a lot of different programming languages while nowadays the tendency is to specialize. While I agree that becoming very good in at least one language is a must on this day an age, I’m sure that not learning more languages is not only a disadvantage but a rather dangerous thing. Here’s why:

The original OOP

I just wanted to share this with you:

https://blog.udemy.com/object-oriented-programming-a-critical-approach/

As mentioned in the post, I also believe that a lot of the beauty of OOP as defined by smalltalk has been lost.

So, if you have not learned smalltalk, you should. It’ll change the way you think about OOP.

Here’s something to help you get started:
http://rmod-pharo-mooc.lille.inria.fr/MOOC/WebPortal/co/content.html

enjoy!

Object oriented vs procedural thinking

I still remember the first time I came in contact with the object oriented concepts. I was surfing on the msdn library (vs6) on a section called books and i stumble upon a book called visual basic 6 business objects. There were only a few chapters included but I found them amazing. I learnt and had been writing vb6 applications for a while back then but found the vocabulary foreign to me: “Business Object”, “Encapsulation”, “Polymorphism” and so on. It immediately hooked me up. The more I learnt, the more I wanted to start coding in this new and awesome way. But when it came to write code I found it so hard to start! The thing is that object oriented requires a new mindset and this change takes time.

Procedural first

I believe that the problem arises because almost every developer is first exposed to procedural programming and usually takes a lot of time to introduce them to object oriented programming. Also the way we are taught object oriented programming is often very poor. This 2 facts combined with a lot of the tutorials out there to learn object oriented languages are procedural exercises further enforces the procedural style into the pure minds of the knowledge seekers.

So what does procedural code looks like? There are so many ways and forms that instead of an example i’ll share some heuristics here.

  1. Your objects contain either just data or just methods
  2. Your objects expose data with the sole purpose to be used by someone else
  3. Almost all of your logic is on static methods

From procedural to object oriented

Procedural programming is a programming paradigm, derived from structured programming, based upon the concept of the procedure call. Procedures, also known as routines, subroutines, or functions (not to be confused with mathematical functions, but similar to those used in functional programming), simply contain a series of computational steps to be carried out. Any given procedure might be called at any point during a program’s execution, including by other procedures or itself. Procedural programming languages include C, Go, Fortran, Pascal, Ada, and BASIC.[1]

So the procedural thinking is all about procedures and the data that you pass to them. You start thinking what the variables are, how they look like (data structures) and what to do with it whereas an object oriented way gets you thinking who does what (responsibilities) and who works with who in order to complete a task (collaboration). The how (implementation) is relegated to a later stage. Instead of thinking on data and procedures, now you have objects that bundle data and procedures in order to do things.

Now comes the tricky part, most of the time you should expose only methods, not data (properties). If you’re familiar with an object oriented language (i.e. java, C#) go and try writing a program without the use of properties. Do not expose any data just for anyone else to use it. Ask for help not for data (encapsulation). This will naturally lead to objects that have data and the methods to manipulate that data. This is good. So instead of writing mailer.send(mail) now you’ll write mail.sendThrough(mailer). And mailer may have something that looks like mailer.send(recipient,sender,subject,body). This subtle change has a big impact on the code. Try it and stop writing pascal on Java 😉

 

TDD: Context is King

So you want to start doing TDD huh? you have read all the blogs about it, seen all the videos on the web and now you’re ready to start. So you open your IDE/code editor of choice and start a new project and a new test project. And you just stare at it. You know what you have to do: write a test, make it fail, write the simplest code to make it pass, refactor the code to make it pretty. Rinse and repeat. The point is, you don’t really know what to test. Or how to know what to test. We all been there, blank face with just one thought: Where do I start?

So the main problem here is the lack of experience. I really can’t think of something else. I guess that’s not a problem when you’re doing TDD with someone who’s already experienced on this, but if this is not your case don’t worry, you just have to do one thing: start.

I guess it’s different for everyone but, I want to share some of my own personal practices on this matter. Hope this helps you getting started.

  1. Define the actions of the system.
  2. Define the business objects on a per use case basis.
  3. Write the test for only one business object first.
  4. Create interfaces for any dependency not defined yet.

Define the actions of the system

One of the most common pitfalls i have seen are the lack of scope and context. I know what i’m going to say sounds dumb but you really, really, really need to sit down and figure out what the system it’s going to do before writing some code. I just have seen so many people failing at this. My favorite technique is using UML use case diagrams. For starters i don’t really dig too much into the details, i just want to have general idea of the system scope and the users involved. A use case diagram let’s you see how the actors are going to interact with it and the specifics actions that a role/persona can do with it. When working on an agile environment i have found that these use cases map nicely with user stories, and even with epics if you’re using scrum. Just keep in mind that this is a high level view of the system. Don’t tangle too much with the details. Even better, don’t think about the details at all. Not a this time.

Define the business objects on a per use case basis

Once you have defined the uses cases for the system, go ahead and select one. Now you can go into the details. So from here i usually use an uml interaction diagram to define the way the objects will cooperate to accomplish the use case objectives. Resist the temptation to start sketching the implementation details: right now the only thing that you care about are the things that you request the object to do and the things that you expect to receive from it. In other words the objects I/O. Remember we are talking about business objects here, unless it’s required by the main flow, don’t put anything infrastructure related, i.e gateways to db, web services and other stuff that doesn’t have business logic but is meant to be used by other objects instead.

Write the test for only one business object first

Now you can start coding! First select the use case that you want to focus on. Now start by creating a file to contain the tests related to one of the related business objects. I adopted some conventions from the bdd movement and usually append specs to the file name. So let’s say i have a business object called BankAccount, the test file would be named BankAccountSpecs. And let’s say that this particular object has a method called Withdraw, then maybe i would create some tests called ShouldDecrementTheFundsOnWithdraw, ShouldFailWithdrawIfNotsufficientFunds and so on. Notice that i started all of my tests with the word “Should”. That’s another bdd adopted convention of mine. I like this one because it’s easier to express what the expected behavior is. In the end you have to remember that you are not testing, you are designing code. At least the implementation of the methods. Also don’t worry if while coding you decide to do things in a different way than that of the interaction diagram, this is part of the show too and it happens very often that an original good idea turns out to be overly complex at the moment of code it. Do not be afraid to try several approaches.

Create interfaces for any dependency not defined yet

If while coding you discover a dependency to an object not yet created, define an interface. Do not struggle trying to create an object to provide the service you need, this probably can be accomplished by another object later on. So just define the interface with the methods you need and use that. Don’t feel bad if you have interfaces with just 1 or 2 methods, this is fine. It’s also a side effect to TDD and a good one 🙂 (google for the interface segregation principle). Anyway now you need an object that implements the interface to be used in your code. You can hand code one. Or you can use a mocking framework. I strongly urge you to consider the later. You should not waste time creating objects for the sake of designing/testing your code. It really does not add value. Go ahead and take a look to any of the many mocking frameworks available for your platform of choice. Experiment until you find one you’re comfortable with and start using it.

Some last words (and warnings)

The purpose of everything that i have covered here it’s to help you getting started. As you keep getting the hang of it you may skip some of the steps outlined here. Maybe you will start creating tests that represent the whole use case instead of using a sequence diagram (i know i have). But if you are on the beginning line I strongly recommend you to follow the procedure I have described above. This will give you something valuable to start doing practicing TDD: Context. What to test? what not to test? where to start? that all depends on the context. Once you have the context set up, the answers to these questions will flow naturally. The rest of the procedure you have already learn from the books, podcasts and posts such as this one: Green, Red, Refactor. Also i have a word of caution here: do not try to write all of the tests before hand. Don’t think of moving from use case to use case gathering all of the use cases to start writing them off later on. This is a bad idea. The reason is simple: you are designing code, not writing tests. Tests are only a tool to design in as much as paper and pen. And when designing code, there are several decisions that have to be made when something unexpected arises from the code. Also some tests will lead to the creation of another tests.

So there you have it. Stay tuned, more on this coming on.

Hacking an intercom security system to open the door with a phone

How it started…

The office I currently work at is located in a building that has an interphone system. So when any of us wants to get in, just push the button an awaits for someone to answer and push a button on the interphone auricular to open the door.

The problem arise when there’s no one inside (or is in the bathroom) to open the door.

So we came up with the idea of creating a service to open the door with the phone. How do we do this?

The algorithm goes something like this:
1)  Find out how the auricular button works
2)  Create a circuit to hack the signal
3)  Code a service to activate the circuit
4)  Code a phone application to communicate with the service

So let’s get it on!

Find out how the auricular works

Fortunately, I work with very skilled folks. So I asked one of them, Javier, to take a look at the device. It turns out that the door works with a magnetic device. The button interrupts the power that keeps the magnet energized. It does that by touching 2 small plates. It couldn’t be any simpler.

Create a circuit to hack the signal

Using a breadboard, Javier came up with a circuit that consisted of a recircuit1lay and an arduino (together with an ethernet shield). The idea was to hook some cables into the plates, and use the relay to close the circuit. To activate the relay, we would have to send an instruction to the Arduino connected to the modem. So all we have to do it’s to connect to the wireless network and send a command to the Arduino’s ip address.

Code a service to activate the circuit

Since i didn’t have any significative experience coding anything on an Arduino (though I had coded something for a rabbit microcontroller before) i went with one of the demos for a web server. After some tweaking and testing, ended up with something like:

#include <SPI.h>
#include <Ethernet.h>

// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {
  0x60, 0xA5, 0xEA, 0x0E, 0x07, 0x10
};
IPAddress ip(200, 200, 200, 200);

EthernetServer server(80);

void setup() {

  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  pinMode(7,OUTPUT);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }


  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
}


void loop() {
 
 // listen for incoming clients
  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
    
// an http request ends with a blank line
    boolean currentLineIsBlank = true;
    String currentLine = "";
    String command = "";
    
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        currentLine = currentLine + c;
        
        // if you've gotten to the end of the line (received a newline
        // character) and the line is blank, the http request has ended,
        // so you can send a reply
        
        if (c == '\n' && currentLineIsBlank && command == "some command") {

          digitalWrite(7, HIGH);  
          delay(1000);              
          digitalWrite(7, LOW);    
          //delay(1000);  
          
          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connection: close");  // the connection will be closed after completion of the response
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");            
          client.println(command);
          client.println("</html>");
          command = "";
          break;
        }
        
        // you're starting a new line 
        if (c == '\n') {                                 
          currentLineIsBlank = true;
          Serial.println("current line = " + currentLine);
          currentLine = "";
        } 
       // you've gotten a character on the current line 
       else if (c != '\r') {                          
          currentLineIsBlank = false;
        } 

       //get the command
       else if (c == '\r' and currentLine.startsWith("GET")){ 
          int start = currentLine.indexOf('/')+1;
          int endAt = currentLine.indexOf(' ',start);
          command = currentLine.substring(start, endAt);         
        }
      }
    }

    // give the web browser time to receive the data
    delay(1);

    // close the connection:
    client.stop();
    Serial.println("client disconnected");
    Ethernet.maintain();
  }
}

The idea behind was to provide a web API that listens for the request to a particular URL. It then extracts the last part of the requested url and uses that command to activate the relay and therefore close the door. Anyone with the ip address and the right URL can activate the relay, as long as it’s one the same subnet as the Arduino.

Code a phone application to communicate with the service

So, Josue (another coworker) suggested that since I had created the web api I could as well create a phone app to consume it. Since most of the people on the office use an android phone, i thought this would be a good opportunity to test the platform. I have zero knowledge of the Android programming model, so on Josues suggestion I took a look to Xamarin. It turn out to be fairly simple. I still have to learn more of the platform tough….

Here’s the code:

 [Activity(Label = "Jarvis", MainLauncher = true, Icon = "@drawable/icon")]
    public class MainActivity : Activity
    {
        private string url = "http://200.200.200.200/";

        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);

            // Set our view from the "main" layout resource
            SetContentView(Resource.Layout.Main);

            // Get our button from the layout resource,
            // and attach an event to it
            Button button = FindViewById<Button>(Resource.Id.MyButton);
            TextView text = FindViewById<TextView>(Resource.Id.textView1);
            
            button.Click += async(sender,e) =>
            {
                try
                {
                    await send(jarvisCommands.openDoor);
                    text.Text += "Get in! \n\r";
                }
                catch (Exception ex)
                {
                    text.Text += ex.Message + "\n\r" + Resources.GetString(Resource.String.Error) + "\n\r";
                }

            };
        }

        private async Task send(jarvisCommands command)
        {
                HttpWebRequest request = (HttpWebRequest) HttpWebRequest.Create(new Uri(url + command.ToString()));
                request.ContentType = "application/text";
                request.Method = "GET";
                await request.GetResponseAsync();
         
        }

        enum jarvisCommands { openDoor}
    }

Learned things:
1) Necessity is the mother of ingenuity
2) You can create interesting stuff when you are surrounded by interesting people
3) If you know Java, C++, C# or any other curly braces language, odds are that you’re already capable of writing something for the Arduino
4) The Intent concept on the Android platform it’s just an implementation of a message bus

I think this is it. Until the next post! (I’ll write often, promise)

App architecture matrix

A friend of mine (who also used to be a coder) invited me to participate in this project of his. As i was on vacation i decided to take a chance and took a look. IMHO the code was unnecesary complex, and that lead to a discussion with the other coders. While my friend was also listening he soon found himself lost in the myriad of *DD terms and design patterns stuff. So i sketch this matrix to help him understand the bigger picture. It just happen to be that i found this little tool useful to get a better understanding of any development project. So i thought i share it with you 😉

The matrix is indeed very simple. It only have 3 columns: Application layer, Technology and Patterns. For a classical DDD application it could be something like:

 

LAYER TECHNOLOGY PATTERNS
Presentation ASP.Net MVC MVC
Application ASP.Net Web API Application Services
Domain Portable Class Library Aggregate, Entity, Value Object, Repository, Domain Services
Infrastructure WCF, MS SQL 2008, Entity Framework

So there you have it. Am i missing something? What would you add/change/remove? Do you use anything similar? Write your answers in the comments.

Codevolution

In the beginning

I was around 14 when i started coding. At first, i only wrote batch files. Later my dad got me a visual studio 6 and a friend of mine lend me a copy of a learning vb6 book. I was thrilled. It was a completely new world. I spend all of my summer vacations in front of the pc. I loved it. While i was at it, i learned of access databases and some sql. Later i learned foxpro 2.6 at school, and since i already had a vfp6 copy, i started coding in vfp as well.

First encounter

I used to read a lot back then. I still do. One day i found an article in MSDN called something like vb6 business objects. As i read on, i became confused: ‘objects’? ‘Inheritance’? ‘Events’ i was familiar with, but what exactly mean ‘polymorphism’? .
Fortunately, Rockford Lhotka (the author) had put a primer on object oriented concepts. Just that was enough for me to understand what the next step on the ladder was.

The quest

Unfortunately, there wasn’t much info on the subject at the time (or at least that i have access to), so all i could wish was to learn the whole thing when i enter college. But that was not the case. They did tell me about encapsulation, inheritance, polymorphism and all the mumbo jumbo words. But i never learned to think in an object oriented fashion. I did however had a decent internet connection at school and so i began to search for more info on the subject. I stumble upon uml, xml, html (what’s the deal with the ML thing?).
Even when had a course in c++ (which was more like c in nature) and java (forms over data kind of) i still feel more comfortable using my dear vb6. I even tried to practice object oriented programming (OOP) in vb6 but found the lack of inheritance an obstacle to most of the exercises found on the net.

A glimpse of hope

Around my 7 semester i had a chance to work in a small software startup. I was so excited! Finally! A place to learn all i was craving for! And learn i did! C#, sql server, and the .net platform. I had the chance to work in real world projects. But somehow i felt that i was missing something. It took me a couple of years to realize that i wasn’t doing oop. I was programming foxpro in the .net platform. I was still procedure oriented. Even when i was using objects,  there were nothing more than data containers that were passed aroumd amongst different functions. I was not there yet. And so i tried looking at things from a different perspective. This time i really tried to create object oriented code. TDD, DDD, BDD (again, what’s with the DD?) And it slowly began to pay. I began to make the shift towards an object oriented mindset. I’m still far from reaching my goal, but i’m steadily getting there.

It’s all in the mind

Continue reading →