Some practical example with a project.

529 views
Skip to first unread message

vivek poddar

unread,
Aug 28, 2014, 3:05:08 AM8/28/14
to clean-code...@googlegroups.com
Hi guys,

I get confused and bored by theories so, I want to learn the architecture best practices by doing practicals. Hence my first project will be a simple 'Url shortner'. If anyone is interested then he is most welcome. As per my knowledge I would like to have the following features in the project:

1. Framework agnostic.
2. DB agnostic.
3. Solid test suite.

I am comfortable with the following OOP langauges:
1. Python
2. Ruby
3. Java

Since, I want to learn the architecture 'The hard way' so, I will doing the following steps:
1. Use case analysis.
2. Entity relationships.
3. Etc (Since I don't know much)

My interest will be to implement the above project in such a way that I can move some part without breaking others,for example I can change DB or framework without breaking my application apart.

My finding so far:
1. Framework (Any lightweight framework should work  eg: sinatra, flask etc)
2. ZeroMQ(if needed)
3. Implementing Clean architecture.

I am fairly new to most of the stuffs discussed above but I have a done a lot of low level coding so, it will be very helpful if someone more experienced give me some helping hand and let me know the best practices. I hope in the end I will start to think in terms of architecture.

Thanks and regards!

Sebastian Gozin

unread,
Aug 28, 2014, 6:50:48 AM8/28/14
to clean-code...@googlegroups.com
What is your first requirement?
Message has been deleted
Message has been deleted

Jakob Holderbaum

unread,
Aug 28, 2014, 12:01:54 PM8/28/14
to clean-code...@googlegroups.com
Hey Vivek!

I'd suggest a different starting point in the process. How can you know
about the objects in the system yet?

Usually I start with a few very simple acceptance specs that inspect
UseCase classes (interactors).

By starting like this, you drive your entire domain by need and not by
speculation. You can become quite surprised by the difference between
your anticipated collaborators and the actual implementations.

Cheers

On 08/28/2014 05:17 PM, vivek poddar wrote:
> Hi,
>
> My first task will be to identifying objects in the system and defining
> relationship b/w them. I also need to prepare an use case diagram which I
> will share soon.
>
> Thanks and regards!
--
Jakob Holderbaum, M.Sc.
Systems Engineer

0176 637 297 71
http://jakob.io
h...@jakob.io
#hldrbm

Sebastian Gozin

unread,
Aug 28, 2014, 4:07:20 PM8/28/14
to clean-code...@googlegroups.com, mail...@jakob.io
I see some messages were deleted though I did receive them by mail.
My response would have been similar to Jakob's to come up with an acceptance tests or example if you will to get you started.

Build it without frameworks, servers or databases. Do just enough design to do that then investigate additional acceptance tests to grow your understanding, design and application.
No big design up front.

vivek poddar

unread,
Aug 29, 2014, 5:56:58 AM8/29/14
to clean-code...@googlegroups.com
Hi,

Thanks @Sebastian Gozin and @Jakob Holderbaum,

As told its my personal project and I have not that much knowledge in OOP. But I will try to study what do you mean by interactors any tutorial links are most welcomed. I also want to learn top to bottom approach hence don't want myself bogged down to technical details first.

here is my sample use case diagram https://www.draw.io/#G0ByYl6uQ2fXrRdWtwYTRRbW02VzA

Its my first try and therefore suggestions are most welcomed. Pls do let me know what can be my next steps?

Thanks and regards!

On Thursday, 28 August 2014 12:35:08 UTC+5:30, vivek poddar wrote:

Jakob Holderbaum

unread,
Aug 29, 2014, 6:13:36 AM8/29/14
to clean-code...@googlegroups.com
Could you post the diagram in an accessible manner so that it is
viewable without a google (or facebook or dropbox or [insert generic
data kraken here]) account? :)

Thanks in advance
Jakob

On 08/29/2014 11:56 AM, vivek poddar wrote:
> Hi,
>
> Thanks @Sebastian Gozin and @Jakob Holderbaum,
>
> As told its my personal project and I have not that much knowledge in OOP.
> But I will try to study what do you mean by *interactors* any tutorial

Sebastian Gozin

unread,
Aug 29, 2014, 6:17:15 AM8/29/14
to clean-code...@googlegroups.com
I would still very much like to know a first requirement.
Something to get started with.

vivek poddar

unread,
Aug 30, 2014, 3:07:50 AM8/30/14
to clean-code...@googlegroups.com
Hi,

Here it is:

Thanks!

vivek poddar

unread,
Aug 30, 2014, 3:16:19 AM8/30/14
to clean-code...@googlegroups.com
Hi,

Sry the actor on the right should be admin.


Thanks!


--
The only way to go fast is to go well.
---
You received this message because you are subscribed to the Google Groups "Clean Code Discussion" group.
To unsubscribe from this group and stop receiving emails from it, send an email to clean-code-discu...@googlegroups.com.
To post to this group, send email to clean-code...@googlegroups.com.
Visit this group at http://groups.google.com/group/clean-code-discussion.



--

         -*- Vivek Poddar -*-             
                                                   
 Technical consultant (OpenERP)  
                                                   
Blog:http://vivekimsit.blogspot.in/  

Jakob Holderbaum

unread,
Aug 30, 2014, 3:33:31 AM8/30/14
to clean-code...@googlegroups.com
Hi!

Why are you focusing in this early stage on requirements extraction by
utilizing UML use cases? I don't necessarily agree upon the enhances
expressiveness. Why not starting out with textual, story card like,
requirements?

[R001]
In order to post a shorter URL
As a new user
I want to post my long URL and get a short one in return

[R002]
In order to get to the shortened destination
As a short URL receiver
I want to be redirected to the actual shortened URL

And if we take usability and specifics out of the discussion for now,
this basically boils it down to the absolute minimum requirements of a
URL shortener.

For me the next step would be to setup an automated acceptance tests
against the non existent Interactor class. You can use Cucumber or
FitNesse. Or you can just drop into your generic unit testing framework
and write some expressive methods as a simple DSL.
(http://jakob.io/rdbltsts)

The question is the interaction level of your acceptance tests. I'd not
go for UI at all. I like to call the Interactors from the tests and
inspect there output/the injected responder.

Specifically there would be the need for two Interactors right now, lets
call them like this:

```
class ShortenURLUseCase; end
class ResolveShortenedURLUseCase; end
```

That is how I'd start this.

I am eager for feedback of you guys, WDYT?

Cheers

On 08/30/2014 09:07 AM, vivek poddar wrote:
> Hi,
>
> Here it is:
>
> <https://lh3.googleusercontent.com/-0s8QvSn-kiQ/VAF4L4pCbaI/AAAAAAAAAO4/lfqBPnUrb9M/s1600/ShortUrl.png>
> Thanks!
>
> On Friday, 29 August 2014 15:47:15 UTC+5:30, Sebastian Gozin wrote:
>>
>> I would still very much like to know a first requirement.
>> Something to get started with.
>>
>> On Friday, August 29, 2014 11:56:58 AM UTC+2, vivek poddar wrote:
>>>
>>> Hi,
>>>
>>> Thanks @Sebastian Gozin and @Jakob Holderbaum,
>>>
>>> As told its my personal project and I have not that much knowledge in
>>> OOP. But I will try to study what do you mean by *interactors* any

vivek poddar

unread,
Aug 31, 2014, 2:17:27 AM8/31/14
to clean-code...@googlegroups.com, mail...@jakob.io
Hi,

Its seems good but what about if I have a much large or complex system with hundreds or thousands of use cases? I think in those cases it will become much difficult to read these textual descriptions. Also, can you provide me some practical example for the acceptance test without having any actual class implementations?

Thanks and regards!

Sebastian Gozin

unread,
Aug 31, 2014, 6:02:41 AM8/31/14
to clean-code...@googlegroups.com, mail...@jakob.io
I believe this is the question about keeping track of the big picture which you e-mailed me privately.
I'll reproduce my answer to you here for others to chime in.

So, about keeping sight of the big picture. This is indeed important and is actually the very first thing I would have you start with. This is the same for Jakob as he was explaining on the forum.
Even though we start almost immediately with writing code we keep track of the big picture by capturing the system requirements in a set of examples called acceptance tests.

This is why I was asking you for your first requirement and not your goal.
Building bit.ly is your goal not your first requirement.
Architecture is all about requirements.
Design is all about how to meet those requirements.

So a first example or requirement could be something like.

// first we turn a few url’s into id’s we can append to our url shortening service base url
// we start with more than 1 to ensure the returned id’s can not be the same

|shorten url                      |
|url                         |id?    |
|http://example.org|$id1=|
|http://google.com |$id2=|

// then we try to resolve the id back to the original url
// but first we start with an unknown id which should return nothing

|query:from shortened url id|unknown|
|url                                                      |

// try the first id

|query:from shortened url id|$id1|
|url                                               |
|http://example.org                      |

// and the second id

|query:from shortened url id|$id2|
|url                                               |
|http://google.com                       |

What you see above are a few examples describing a url shortener like system.
They are written down in the form of fit tables which is a formal syntax which can be coupled to software code in order to test if the software meets the examples described in the fit tables.
For more information on how to do that I suggest you download http://fitnesse.org and try it out.
You can do similar things with Cucumber for example.

This is all the architecture work I would start with.
Now it is time to write code which meets these requirements.

You’ll maybe practice TDD to write this code. You’d probably write some unit tests and perhaps a first persistence strategy (I’d suggest an in memory one).
You can write this system whatever way you want. You’ll keep track of the big picture by running the acceptance tests and making sure they pass.

Once that is done it will be time to have another discussion with the product owner to come up with additional examples or requirements the system should meet.
For example,

|scenario|shortening _ twice should yield the same id|url|
|ensure|shortening|@url|twice yields the same id            |

|script|application driver|
|shortening http://example.org twice should yield the same id|

// because I’d expect the business to want to perform analytics against who uses a particular id and url combo a lot so we want to track the same url with the same id.

Now you write some additional code to meet this new requirement and so on and so forth.
Each cycle is called an iteration and you will grow your understanding of the architecture as you compile more and more examples in your acceptance test suite.
At the same time you will grow a working application along with the requirements. You will make changes to it guided by the requirements and probably by your TDD test suite.

Perhaps at this point you’d want to go a little further with implementing a real persistence strategy using SQL, Mongo or DynamoDB.
You could implement a web service which exposes your application functionality to the world. Remember to write integration tests for these things.
And deploy your application to a PaaS platform like AWS BeanStalk, Jelastic, Heroku or CloudFoundry so your product owners can see your application in action.

Remember, your acceptance test suite will keep track of the big picture for you.
Just add a few example, implement, deploy and repeat.

Jakob Holderbaum

unread,
Aug 31, 2014, 1:18:13 PM8/31/14
to clean-code...@googlegroups.com
That is a very thorough and reflected summary of what I'd have written
next :)

I like the reference to Fit, had some really good experiences with it
for embedded projects.

Don't think about losing documentation value by not using UML UC
Diagrams. I think executable documentation like this here is worth a
thousand UML diagrams. And to be honest, a well extracted requirement
should be relatively small, so paring a diagram with you eye takes
probably the same amount of time as reading such a requirement.

And if you have thousands of them, well, then you have a lot of
requirements, not really a difference if a thousand diagrams or a
thousand short statements.

These are my 2 cents.

Cheers
Jakob

vivek poddar

unread,
Sep 2, 2014, 1:42:06 AM9/2/14
to clean-code...@googlegroups.com
Hi,

I just checked http://fitnesse.org and found that it has a very good support for Java, but my language of choice will be either Ruby or Python and I don't see much documentation for them specially for python. I would like to know if there is some better alternative or how to use fitnesse for the above to language.

Hope someone can share their practical experience with them.

Thanks and regards!



#hldrbm

--
The only way to go fast is to go well.
--- You received this message because you are subscribed to the Google Groups "Clean Code Discussion" group.
To unsubscribe from this group and stop receiving emails from it, send an email to clean-code-discussion+unsub...@googlegroups.com.
To post to this group, send email to clean-code-discussion@googlegroups.com.

Sebastian Gozin

unread,
Sep 2, 2014, 5:11:45 AM9/2/14
to clean-code...@googlegroups.com
I don't have experience using RubyFIT so I can't help you much there.
I do know that a lot of Ruby projects seem to prefer Cucumber over FitNesse though.
To unsubscribe from this group and stop receiving emails from it, send an email to clean-code-discussion+unsubscri...@googlegroups.com.
To post to this group, send email to clean-code...@googlegroups.com.

vivek poddar

unread,
Sep 2, 2014, 5:13:46 AM9/2/14
to clean-code...@googlegroups.com
Hi,

After some research I have gone for some simpler approach for acceptance testing i.e. rspec and that's why I have decided to use ruby for this project.

I am trying to follow the Clean architecture and hence following this architecture: http://blog.groupbuddies.com/posts/20-clean-architecture

Pls, do let me know if I am on the right path.

Thanks :)

Jakob Holderbaum

unread,
Sep 2, 2014, 5:49:07 AM9/2/14
to clean-code...@googlegroups.com
I used FitNesse with C and ruby a lot, so thats not such a big problem.

See https://github.com/unclebob/rubyslim for more information!

On 09/02/2014 07:42 AM, vivek poddar wrote:
> Hi,
>
> I just checked http://fitnesse.org and found that it has a very good
> support for Java, but my language of choice will be either Ruby or Python
> and I don't see much documentation for them specially for python. I would
> like to know if there is some better alternative or how to use *fitnesse *for
>> email to clean-code-discu...@googlegroups.com.
>> To post to this group, send email to clean-code-discussion@
>> googlegroups.com.
>> Visit this group at http://groups.google.com/group/clean-code-discussion.
>>
>
>
>

--

Karl Miller

unread,
Sep 2, 2014, 4:09:49 PM9/2/14
to clean-code...@googlegroups.com
You could also look at the Obvious Architecture, which is approximately the same
http://obvious.retromocha.com/



To post to this group, send email to clean-code-discussion@
googlegroups.com.
Visit this group at http://groups.google.com/group/clean-code-discussion.


--
Jakob Holderbaum, M.Sc.
Systems Engineer

0176 637 297 71
http://jakob.io
h...@jakob.io
#hldrbm

--
The only way to go fast is to go well.
--- You received this message because you are subscribed to the Google Groups "Clean Code Discussion" group.
To unsubscribe from this group and stop receiving emails from it, send an email to clean-code-discussion+unsub...@googlegroups.com.

Jakob Holderbaum

unread,
Sep 3, 2014, 2:18:36 AM9/3/14
to clean-code...@googlegroups.com
I am not a big fan behind that concept!

The entire idea about system architecture is agnosticism from frameworks
and implementation details. All the stuff that changes rapidly shouldn't
be part of your application.

By embedding an actual framework into the inner core of your
architecture, you certainly will end up in a world of pain.

And by the way, a well crafted application structure is simple (not
easy). And simple things don't need frameworks.

WDYT?

Cheers
Jakob
>>>> email to clean-code-discu...@googlegroups.com.
>>>> To post to this group, send email to clean-code-discussion@
>>>> googlegroups.com.
>>>> Visit this group at http://groups.google.com/group/clean-code-discussion
>>>> .
>>>>
>>>>
>>>
>>>
>>>
>> --
>> Jakob Holderbaum, M.Sc.
>> Systems Engineer
>>
>> 0176 637 297 71
>> http://jakob.io
>> h...@jakob.io
>> #hldrbm
>>
>> --
>> The only way to go fast is to go well.
>> --- You received this message because you are subscribed to the Google
>> Groups "Clean Code Discussion" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to clean-code-discu...@googlegroups.com.

Jakob Holderbaum

unread,
Sep 3, 2014, 3:24:47 AM9/3/14
to clean-code...@googlegroups.com
A good start!

I would strive for a more expressive approach in testing. Don't focus so
much on method names, but try to express intent. I like to create
high-level DSL methods that describe more expressive what I am about to
do or whats the intention of the respective test:

https://gist.github.com/anonymous/d8a7107ebccc9460432a

Why did you choose rspec, special reason or just a personal preference?

WDYT?

Cheers
Jakob

On 09/02/2014 11:13 AM, vivek poddar wrote:
> Hi,
>
> After some research I have gone for some simpler approach for acceptance
> testing i.e. rspec and that's why I have decided to use ruby for this
> project.
> This is my gist link:
> https://gist.github.com/vivekimsit/da3e22857e6baeb28f2a
>
> I am trying to follow the *Clean architecture* and hence following this
> architecture: http://blog.groupbuddies.com/posts/20-clean-architecture
>
> Pls, do let me know if I am on the right path.
>
> Thanks :)
>
>
> On Tue, Sep 2, 2014 at 11:12 AM, vivek poddar <vivek...@gmail.com> wrote:
>
>> Hi,
>>
>> I just checked http://fitnesse.org and found that it has a very good
>> support for Java, but my language of choice will be either Ruby or Python
>> and I don't see much documentation for them specially for python. I would
>> like to know if there is some better alternative or how to use *fitnesse *for
>>> email to clean-code-discu...@googlegroups.com.
>>> To post to this group, send email to clean-code-discussion@
>>> googlegroups.com.
>>> Visit this group at http://groups.google.com/group/clean-code-discussion.
>>>
>>
>>
>>
>> --
>>
>> -*- *Vivek Poddar* -*-
>>
>> *Technical consultant (OpenERP)*
>>
>>
>> *Blog:http://vivekimsit.blogspot.in/ <http://vivekimsit.blogspot.in/> *

vivek poddar

unread,
Sep 3, 2014, 4:23:05 AM9/3/14
to clean-code...@googlegroups.com
Hi @Jakob,

Its feels good that atleast someone is taking interest in my discussion. Ya, I really agree with you that all part of the system should be independent to each other and I think that's why The clean architecture was proposed. I will try to adhere to that concept.

Second, about choosing rspec. I found that it nicely follows the concept of BDD I tried to look at the other tools like Cucumber and Fitnesse but they were either not compatible with ruby or assumed that I am doing my testing through browser interface and I personally don't like that idea.

Now comes the important part:
1. Why need to use DSL for the tests? how they are helpful in decoupling our test from implementation? or how they will prove helpful in if we scale our application?
2. At present we haven't implemented our Key method then how we are checking it? can you please clarify the use of key_for method?

Thanks again :)









To post to this group, send email to clean-code-discussion@
googlegroups.com.
Visit this group at http://groups.google.com/group/clean-code-discussion.




--

          -*- *Vivek Poddar* -*-

  *Technical consultant (OpenERP)*


*Blog:http://vivekimsit.blogspot.in/ <http://vivekimsit.blogspot.in/>   *


--
Jakob Holderbaum, M.Sc.
Systems Engineer

0176 637 297 71
http://jakob.io
h...@jakob.io
#hldrbm

--
The only way to go fast is to go well.
--- You received this message because you are subscribed to the Google Groups "Clean Code Discussion" group.
To unsubscribe from this group and stop receiving emails from it, send an email to clean-code-discussion+unsub...@googlegroups.com.

To post to this group, send email to clean-code-discussion@googlegroups.com.
Visit this group at http://groups.google.com/group/clean-code-discussion.



--

Karl Miller

unread,
Sep 3, 2014, 4:50:52 AM9/3/14
to clean-code...@googlegroups.com

Apologies for my hasty reply. I wasn't really suggesting that anyone use Obvious as a framework. But as a concrete example outline to refer to it maybe helps in understanding the concepts.


To post to this group, send email to clean-code-discussion@
googlegroups.com.
Visit this group at http://groups.google.com/group/clean-code-discussion
.


--
Jakob Holderbaum, M.Sc.
Systems Engineer

0176 637 297 71
http://jakob.io
h...@jakob.io
#hldrbm

--
The only way to go fast is to go well.
--- You received this message because you are subscribed to the Google
Groups "Clean Code Discussion" group.
To unsubscribe from this group and stop receiving emails from it, send an

To post to this group, send email to clean-code-discussion@
googlegroups.com.
Visit this group at http://groups.google.com/group/clean-code-discussion.


--
Jakob Holderbaum, M.Sc.
Systems Engineer

0176 637 297 71
http://jakob.io
h...@jakob.io
#hldrbm

--
The only way to go fast is to go well.
--- You received this message because you are subscribed to the Google Groups "Clean Code Discussion" group.
To unsubscribe from this group and stop receiving emails from it, send an email to clean-code-discussion+unsub...@googlegroups.com.

To post to this group, send email to clean-code-discussion@googlegroups.com.

Jakob Holderbaum

unread,
Sep 3, 2014, 5:09:19 AM9/3/14
to clean-code...@googlegroups.com
Well, I just gave an example tests without the intermediate
implementation steps. You certainly don't want to start with this amount
of tests head first.

Write the first one, implement it some-how, refactor it, and start over
with the next test.

The DSL should fulfill two purposes:

1) *Revelation of Intent.* Nothing communicates better what you want to
do than actual method names. `key_for(url)` says: "give me the key you
would have generated for the given url". That is the only way I know to
write acceptance tests in code that "read like well written prose"

2) *Decoupling from implementation.* How knows what changes in your
implementations. An you will certainly have lots of tests that generate
keys for urls. It'll drive you to madness, if you have to change all of
these acceptance tests, just because you rename some interface methods.

My question regarding rspec was more a question of why you chose rspec
over minitest? With minitest/spec you get the same syntax without the
overhead, just my opinion.

And Cucumber is not necessarily biased towards UI testing. Thats
capybara. Cucumber is just the Text-to-Code framework based on Gherkin
and the implementations of the steps can do whatever you want.

Any questions left?

Cheers

On 09/03/2014 10:23 AM, vivek poddar wrote:
> Hi @Jakob,
>
> Its feels good that atleast someone is taking interest in my discussion.
> Ya, I really agree with you that all part of the system should be
> independent to each other and I think that's why *The clean architecture *was
> proposed. I will try to adhere to that concept.
>
> Second, about choosing rspec. I found that it nicely follows the concept of
> BDD I tried to look at the other tools like *Cucumber and Fitnesse *but
> they were either not compatible with ruby or assumed that I am doing my
> testing through browser interface and I personally don't like that idea.
>
> Now comes the important part:
> 1. Why need to use DSL for the tests? how they are helpful in decoupling
> our test from implementation? or how they will prove helpful in if we scale
> our application?
> 2. At present we haven't implemented our *Key *method then how we are
> checking it? can you please clarify the use of *key_for *method?
>>>>> email to clean-code-discu...@googlegroups.com.
>>>>> To post to this group, send email to clean-code-discussion@
>>>>> googlegroups.com.
>>>>> Visit this group at http://groups.google.com/
>>>>> group/clean-code-discussion.
>>>>>
>>>>>
>>>>
>>>>
>>>> --
>>>>
>>>> -*- *Vivek Poddar* -*-
>>>>
>>>> *Technical consultant (OpenERP)*
>>>>
>>>>
>>>> *Blog:http://vivekimsit.blogspot.in/ <http://vivekimsit.blogspot.in/>
>>>> *
>>>>
>>>>
>>>
>>>
>>>
>> --
>> Jakob Holderbaum, M.Sc.
>> Systems Engineer
>>
>> 0176 637 297 71
>> http://jakob.io
>> h...@jakob.io
>> #hldrbm
>>
>> --
>> The only way to go fast is to go well.
>> --- You received this message because you are subscribed to the Google
>> Groups "Clean Code Discussion" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to clean-code-discu...@googlegroups.com.
>> To post to this group, send email to clean-code-discussion@
>> googlegroups.com.
>> Visit this group at http://groups.google.com/group/clean-code-discussion.
>>
>
>
>

--

Sebastian Gozin

unread,
Sep 3, 2014, 5:33:12 AM9/3/14
to clean-code...@googlegroups.com, mail...@jakob.io
I think rspec/minitest is good to get started without the cognitive overhead of fitnesse/cucumber. And there is one.

Still rspec/minitest is not a good alternative to fitnesse/cucumber if you care about engaging the product owner in the requirements specification process.
So learning fitnesse/cucumber is worth it imo.
But if you have no product owner or he refuses to participate then a more programmer oriented tool like rspec/minitest is more convenient.

I would stress though that I consider the point of view of the product owner as the big picture so I would like it to exist in some way so that it is obvious to me it is not my one-sided narrow programmer point of view.
Hence why I try to take clever advantage of DSL's to word things without technical detail so that I don't mistake it for a programmer test.
>>>>> To post to this group, send email to clean-code-discussion@
>>>>> googlegroups.com.
>>>>> Visit this group at http://groups.google.com/
>>>>> group/clean-code-discussion.
>>>>>
>>>>>
>>>>
>>>>
>>>> --
>>>>
>>>>            -*- *Vivek Poddar* -*-
>>>>
>>>>    *Technical consultant (OpenERP)*
>>>>
>>>>
>>>> *Blog:http://vivekimsit.blogspot.in/ <http://vivekimsit.blogspot.in/>
>>>>   *
>>>>
>>>>
>>>
>>>
>>>
>> --
>> Jakob Holderbaum, M.Sc.
>> Systems Engineer
>>
>> 0176 637 297 71
>> http://jakob.io
>> h...@jakob.io
>> #hldrbm
>>
>> --
>> The only way to go fast is to go well.
>> --- You received this message because you are subscribed to the Google
>> Groups "Clean Code Discussion" group.
>> To unsubscribe from this group and stop receiving emails from it, send an

vivek poddar

unread,
Sep 3, 2014, 6:05:51 AM9/3/14
to clean-code...@googlegroups.com
Hi @sebastian,

I totally agree with you. Getting comfortable with cucumber or fitness needs some time and since I have so much to learn. I am not ignoring their importance but I need things going now. I will learn them before starting my second project ;)

Thanks :)




To unsubscribe from this group and stop receiving emails from it, send an email to clean-code-discu...@googlegroups.com.
To post to this group, send email to clean-code...@googlegroups.com.



--

vivek poddar

unread,
Sep 8, 2014, 1:57:35 AM9/8/14
to clean-code...@googlegroups.com
Hi @Jakob,

I did some research on the algorithm for url shortener service and came to the following conclusions:

1. Insert the record and have unique id(pk) for them. (If not already there)
2. Take the auto incremented primary key and convert it to the readable format i.e. base36

But the above solution has many issues like:

1. Need to decide the persistence mechanism and rely on that.
2. Where to put the validation logic in the repository or in the interactor for example an empty URL should not be proccessed etc.

I just want some architectural advice from my friends here and pls let me know where I am doing wrong and how to proceed from here? also, I want my application to be used from cli, web and mobile app.

PS: I have updated the gist for the revised code. https://gist.github.com/vivekimsit/da3e22857e6baeb28f2a


 

Jakob Holderbaum

unread,
Sep 8, 2014, 4:18:31 AM9/8/14
to clean-code...@googlegroups.com
Well, you should probably shift a gear down with assumptions. Your
requirements don't reflect a click counter nor a time of creation. Since
that is none of your concern right now, and it is also not reflected in
your Acceptance Tests, why bothering?

I would also step away from static dependencies inside of your
interactor. Don't write a class name here. Inject the repo instance from
the test in the constructor of your interactor for a start. So it can be
easily changed later.

I see interactors as delegators. Most of the logic should live in
different units that are used by the delegator.

Now to your problem with the IDs. You don't have to insert a record to
get a unique identifier. You can implement this concept in a ton of
different ways.

Think of a new injected service, that will give you a new, the next, ID
directly in the desired format.

I would construct the entity with your URL only:

```ruby
short_url = ShortUrl.new(@url)
```

validate it, which is in this simple case probably best done in the
entity. I would validate for null values and of course a proper url format:

```ruby
short_url.valid?
```

Based on this validation you could set an error message so that the
consumer of your interactor nows what went wrong.

When everything is smooth you could retrieve the next ID and assign it
to the entity:

```ruby
id = short_url_authority.next_identifier
short_url.identified_with(id)
```

and finally safe it of into the repo:

```ruby
short_url_repo.save(short_url)
```

The authority could be simply implemented in memory (as with your repo
for now):

```ruby
require 'monitor'
ShortUrlAuthorityInMemory
def next_identifier
synchronized do
generate_next_identifier
end
end

def generate_next_identifier
@counter ||= 0
convert @counter += 1
end

def convert(numeric_id)
numeric_id.to_s(32)
end

def synchronized(&sync)
@lock ||= Monitor.new
@lock.synchronize(&sync)
end
end
```

By this your repo gets even simpler because it has less responsibilities.

WDYT?
>>>>>>>>> email to clean-code-discu...@googlegroups.com.
>>>>>>>>> To post to this group, send email to clean-code-discussion@
>>>>>>>>> googlegroups.com.
>>>>>>>>> Visit this group at http://groups.google.com/
>>>>>>>>> group/clean-code-discussion.
>>>>>>>>>
>>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> --
>>>>>>>>
>>>>>>>> -*- *Vivek Poddar* -*-
>>>>>>>>
>>>>>>>> *Technical consultant (OpenERP)*
>>>>>>>>
>>>>>>>>
>>>>>>>> *Blog:http://vivekimsit.blogspot.in/ <http://vivekimsit.blogspot.
>>>> in/>
>>>>>>>> *
>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>> --
>>>>>> Jakob Holderbaum, M.Sc.
>>>>>> Systems Engineer
>>>>>>
>>>>>> 0176 637 297 71
>>>>>> http://jakob.io
>>>>>> h...@jakob.io
>>>>>> #hldrbm
>>>>>>
>>>>>> --
>>>>>> The only way to go fast is to go well.
>>>>>> --- You received this message because you are subscribed to the
>>>> Google
>>>>>> Groups "Clean Code Discussion" group.
>>>>>> To unsubscribe from this group and stop receiving emails from it,
>>>> send an
>>>>>> email to clean-code-discu...@googlegroups.com.
>>>>>> To post to this group, send email to clean-code-discussion@
>>>>>> googlegroups.com.
>>>>>> Visit this group at http://groups.google.com/
>>>> group/clean-code-discussion.
>>>>>>
>>>>>
>>>>>
>>>>>
>>>>
>>>> --
>>>> Jakob Holderbaum, M.Sc.
>>>> Systems Engineer
>>>>
>>>> 0176 637 297 71
>>>> http://jakob.io
>>>> h...@jakob.io
>>>> #hldrbm
>>>>
>>> --
>>> The only way to go fast is to go well.
>>> ---
>>> You received this message because you are subscribed to the Google Groups
>>> "Clean Code Discussion" group.
>>> To unsubscribe from this group and stop receiving emails from it, send an
>>> email to clean-code-discu...@googlegroups.com.
>>> To post to this group, send email to
>>> clean-code...@googlegroups.com.
>>> Visit this group at http://groups.google.com/group/clean-code-discussion.
>>>
>>
>>
>>
>> --
>>
>> -*- *Vivek Poddar* -*-
>>
>> *Technical consultant (OpenERP)*
>>
>>
>> *Blog:http://vivekimsit.blogspot.in/ <http://vivekimsit.blogspot.in/> *
>>
>

--
Jakob Holderbaum, M.Sc.
Systems Engineer

0176 637 297 71
http://jakob.io
h...@jakob.io
@hldrbm

vivek poddar

unread,
Sep 8, 2014, 6:52:23 AM9/8/14
to clean-code...@googlegroups.com
Thanks,

Just one doubt, ShortUrlAuthorityInMemory will be singleton like my InMemory repo class right?


To post to this group, send email to clean-code-discussion@
googlegroups.com.
Visit this group at http://groups.google.com/
group/clean-code-discussion.




--

            -*- *Vivek Poddar* -*-

    *Technical consultant (OpenERP)*


*Blog:http://vivekimsit.blogspot.in/ <http://vivekimsit.blogspot.
in/>
   *





--
Jakob Holderbaum, M.Sc.
Systems Engineer

0176 637 297 71
http://jakob.io
h...@jakob.io
#hldrbm

--
The only way to go fast is to go well.
--- You received this message because you are subscribed to the
Google
Groups "Clean Code Discussion" group.
To unsubscribe from this group and stop receiving emails from it,
send an

To post to this group, send email to clean-code-discussion@
googlegroups.com.
Visit this group at http://groups.google.com/
group/clean-code-discussion.





--
Jakob Holderbaum, M.Sc.
Systems Engineer

0176 637 297 71
http://jakob.io
h...@jakob.io
#hldrbm

  --
The only way to go fast is to go well.
---
You received this message because you are subscribed to the Google Groups
"Clean Code Discussion" group.
To unsubscribe from this group and stop receiving emails from it, send an

To post to this group, send email to
clean-code-discussion@googlegroups.com.



--

          -*- *Vivek Poddar* -*-

  *Technical consultant (OpenERP)*


*Blog:http://vivekimsit.blogspot.in/ <http://vivekimsit.blogspot.in/>   *


--
Jakob Holderbaum, M.Sc.
Systems Engineer

0176 637 297 71
http://jakob.io
h...@jakob.io
@hldrbm


--
The only way to go fast is to go well.
--- You received this message because you are subscribed to the Google Groups "Clean Code Discussion" group.
To unsubscribe from this group and stop receiving emails from it, send an email to clean-code-discussion+unsub...@googlegroups.com.

To post to this group, send email to clean-code-discussion@googlegroups.com.

Jakob Holderbaum

unread,
Sep 8, 2014, 2:48:54 PM9/8/14
to clean-code...@googlegroups.com
Well no! Don't focus to much on singletons, they will reduce flexibility
of your system.

Whenever you write `MyClass.instance`, you create a static dependency to
`MyClass`, making it complicated to stub it out in a test or change the
implementation.

Try to think of instances that fulfill an interface. Your implicit
interface is the `short_url_authority` with the method
`next_identifier`. Also your `short_url_repo` is an interface, that
currently consists of one method: `save(short_url)`.

If you inject objects into the interactor that fulfill these interfaces
and thus playing these roles, everything is more loosely coupled.

```ruby
# the definition

class ShortenUrl < Interactor
def initialize(services, url)
@short_url_repo = services.fetch(:short_url_repo)
# ...
end
# ...
end

# the test:

services = {
:short_url_repo => ShortUrlRepoInMemory.new
# or
:short_url_repo => RepoStub.new
# ...
}
ShortUrl.call(services, "http://google.com/")
```

By this approach, implementations can be substituted in every imaginable
way.

What are other opinions here?
>>>>>>>>>>> email to clean-code-discu...@googlegroups.com.
>>>>>>>>>>> To post to this group, send email to clean-code-discussion@
>>>>>>>>>>> googlegroups.com.
>>>>>>>>>>> Visit this group at http://groups.google.com/
>>>>>>>>>>> group/clean-code-discussion.
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> --
>>>>>>>>>>
>>>>>>>>>> -*- *Vivek Poddar* -*-
>>>>>>>>>>
>>>>>>>>>> *Technical consultant (OpenERP)*
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> *Blog:http://vivekimsit.blogspot.in/ <http://vivekimsit.blogspot.
>>>>>>>>>>
>>>>>>>>> in/>
>>>>>>
>>>>>>> *
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> --
>>>>>>>> Jakob Holderbaum, M.Sc.
>>>>>>>> Systems Engineer
>>>>>>>>
>>>>>>>> 0176 637 297 71
>>>>>>>> http://jakob.io
>>>>>>>> h...@jakob.io
>>>>>>>> #hldrbm
>>>>>>>>
>>>>>>>> --
>>>>>>>> The only way to go fast is to go well.
>>>>>>>> --- You received this message because you are subscribed to the
>>>>>>>>
>>>>>>> Google
>>>>>>
>>>>>>> Groups "Clean Code Discussion" group.
>>>>>>>> To unsubscribe from this group and stop receiving emails from it,
>>>>>>>>
>>>>>>> send an
>>>>>>
>>>>>>> email to clean-code-discu...@googlegroups.com.
>>>>>>>> To post to this group, send email to clean-code-discussion@
>>>>>>>> googlegroups.com.
>>>>>>>> Visit this group at http://groups.google.com/
>>>>>>>>
>>>>>>> group/clean-code-discussion.
>>>>>>
>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>> --
>>>>>> Jakob Holderbaum, M.Sc.
>>>>>> Systems Engineer
>>>>>>
>>>>>> 0176 637 297 71
>>>>>> http://jakob.io
>>>>>> h...@jakob.io
>>>>>> #hldrbm
>>>>>>
>>>>>> --
>>>>> The only way to go fast is to go well.
>>>>> ---
>>>>> You received this message because you are subscribed to the Google
>>>>> Groups
>>>>> "Clean Code Discussion" group.
>>>>> To unsubscribe from this group and stop receiving emails from it, send
>>>>> an
>>>>> email to clean-code-discu...@googlegroups.com.
>>>>> To post to this group, send email to
>>>>> clean-code...@googlegroups.com.
>>>>> Visit this group at http://groups.google.com/
>>>>> group/clean-code-discussion.
>>>>>
>>>>>
>>>>
>>>>
>>>> --
>>>>
>>>> -*- *Vivek Poddar* -*-
>>>>
>>>> *Technical consultant (OpenERP)*
>>>>
>>>>
>>>> *Blog:http://vivekimsit.blogspot.in/ <http://vivekimsit.blogspot.in/>
>>>> *
>>>>
>>>>
>>>
>> --
>> Jakob Holderbaum, M.Sc.
>> Systems Engineer
>>
>> 0176 637 297 71
>> http://jakob.io
>> h...@jakob.io
>> @hldrbm
>>
>>
>> --
>> The only way to go fast is to go well.
>> --- You received this message because you are subscribed to the Google
>> Groups "Clean Code Discussion" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to clean-code-discu...@googlegroups.com.
>> To post to this group, send email to clean-code-discussion@
>> googlegroups.com.
>> Visit this group at http://groups.google.com/group/clean-code-discussion.
>>
>

Jakob Holderbaum

unread,
Sep 12, 2014, 1:15:32 PM9/12/14
to clean-code...@googlegroups.com
How is your example going? Something to show off, yet? :)

Cheers

vivek poddar

unread,
Sep 12, 2014, 2:01:19 PM9/12/14
to clean-code...@googlegroups.com
Hi Jakob Holderbaum,

I am very glad that you are taking interest in my project :) .Its doing well actually I was a bit busy in my job but that should not be an excuse ;)
that said  I am wiring my app to Sinatra for web delivery. 

The interesting thing that I am noticing while working in this project is that I have developed a lot of confidence that my code is going to work well,
thanks to those UseCase  testing stuff, now I can feel my interactors as wires to my application and since those wires are in good condition hence 
I can plug them to any delivery mechanism.

But still I need to learn a few bits more, like:
1. How to test browser inputs/outputs? I think those are called end-to-end tests right? Is acceptance tests and end-to-end tests are different?
2. Need to implement SQLite as persistence mechanism, at present its in memory.
3. And more stuffs I may not know rigth now :), like error and exception handlings that I skipped totally.

I know that its not going to be an easy journey, but that needs to be done. Hope people like you will keep on motivating newbies like me.

Thanks!

in/>

To post to this group, send email to clean-code-discussion@
googlegroups.com.
Visit this group at http://groups.google.com/

group/clean-code-discussion.






--
Jakob Holderbaum, M.Sc.
Systems Engineer

0176 637 297 71
http://jakob.io
h...@jakob.io
#hldrbm

    --
The only way to go fast is to go well.
---
You received this message because you are subscribed to the Google
Groups
"Clean Code Discussion" group.
To unsubscribe from this group and stop receiving emails from it,
send
an

To post to this group, send email to
clean-code-discussion@googlegroups.com.
Visit this group at http://groups.google.com/
group/clean-code-discussion.




--

           -*- *Vivek Poddar* -*-

   *Technical consultant (OpenERP)*


*Blog:http://vivekimsit.blogspot.in/ <http://vivekimsit.blogspot.in/>
  *


--
Jakob Holderbaum, M.Sc.
Systems Engineer

0176 637 297 71
http://jakob.io
h...@jakob.io
@hldrbm


--
The only way to go fast is to go well.
--- You received this message because you are subscribed to the Google
Groups "Clean Code Discussion" group.
To unsubscribe from this group and stop receiving emails from it,
send an

Sebastian Gozin

unread,
Sep 14, 2014, 6:13:50 PM9/14/14
to clean-code...@googlegroups.com
Acceptance tests and end-to-end tests are different yes. Because a UI is difficult to program against as it is meant to be consumed by humans who can process fancy things like colours, popups and buttons. When writing acceptance tests I tend to bypass the UI and the Database so I can focus on the requirements.

Good luck with your efforts.
system should meet.
|shortening <a href="http://example.
...

vivek poddar

unread,
Sep 16, 2014, 5:25:19 AM9/16/14
to clean-code...@googlegroups.com
Hi,

After some fiddling with the code I have succeeded in building a working application, you can find the gist here: https://gist.github.com/vivekimsit/da3e22857e6baeb28f2a . I will upload it on github soon when I feel its mature enough to serve as a good example.

My summary of what I have done till now:

1. Kept the dependency in single direction, Hopefully :).
2. Built serialization module, which ensures that my use case gets a uniform hash representation of the entity object.
3. Used repository pattern so that persistence mechanism are transparent to my application.
4. Applied the web delivery mechanism and used a minimal overhead sinatra framework for that.

Doubts:
1. At present I feel that my application wide configurations are scattered.
2. When I used data-mapper then I felt some pain to use my entity object in the interactor because data-mapper was returning its own objects so, I serialized it.

What is left:

1. The other half of the application where I will redirect the user to the website.
2. Handling errors and exceptions.
3. Caching mechanism to reduce server load (I may use memcache)

This is what I have done till now, looking for valuable feedback from all clean-coders and specially from Jakob :)

Thanks

--
The only way to go fast is to go well.
---
You received this message because you are subscribed to the Google Groups "Clean Code Discussion" group.
To unsubscribe from this group and stop receiving emails from it, send an email to clean-code-discu...@googlegroups.com.
To post to this group, send email to clean-code...@googlegroups.com.

Jakob Holderbaum

unread,
Sep 16, 2014, 10:10:24 AM9/16/14
to clean-code...@googlegroups.com
First of all, the entire idea of github is to publish what you have. If
everyone would wait for perfection, well, there wouldn't be much on gh
at all :)
Just push it and add a disclaimer (e.g. "this is experimental") to the
README. This way people can make pull requests for ideas or refactorings.

I think the biggest issue of your current system is the missing concept
of concrete entities. You url entity is merely a bag of data, not even
used in the use case (it should be used there).
(See http://www.martinfowler.com/bliki/AnemicDomainModel.html)

The gateway should accept and provide actual entities and serialize them
to a persistable implementation. By this approach all of your different
gateway implementations still work with your central entity, so they are
transparently substitutable.

So, to save, you pass an entity object to the gateway. Internally, the
gateway serializes this to some hash and stores this hash away. To
retrieve, you call the gateway with an id or url (or some other query,
whatever your interface is) and get back an actual entity object.
Internally, the GW retrieves the serialized hash from its persistence
layer and deserializes it to an instance of the entity.

Hope I expressed myself clearly. I am planning to write a more detailed
blog (http://jakob.io) article about this topic cause I stopped counting
how often I discussed this issue with different people :) I will let you
know.

What do the other fellows think?

Cheers
Jakob

On 09/16/2014 11:25 AM, vivek poddar wrote:
> Hi,
>
> After some fiddling with the code I have succeeded in building a working
> application, you can find the gist here:
> https://gist.github.com/vivekimsit/da3e22857e6baeb28f2a . I will upload it
> on github soon when I feel its mature enough to serve as a good example.
>
> My summary of what I have done till now:
>
> 1. Kept the dependency in single direction, Hopefully :).
> 2. Built serialization module, which ensures that my use case gets a
> uniform hash representation of the entity object.
> 3. Used repository pattern so that persistence mechanism are transparent to
> my application.
> 4. Applied the web delivery mechanism and used a minimal overhead sinatra
> framework for that.
>
> Doubts:
> 1. At present I feel that my application wide configurations are scattered.
> 2. When I used data-mapper then I felt some pain to use my entity object in
> the interactor because data-mapper was returning its own objects so, I
> serialized it.
>
> What is left:
>
> 1. The other half of the application where I will redirect the user to the
> website.
> 2. Handling errors and exceptions.
> 3. Caching mechanism to reduce server load (I may use memcache)
>
> This is what I have done till now, looking for valuable feedback from all
> clean-coders and specially from *Jakob *:)
>
> Thanks
>
> On Mon, Sep 15, 2014 at 3:43 AM, Sebastian Gozin <s...@thinkerit.be> wrote:
>
>> Acceptance tests and end-to-end tests are different yes. Because a UI is
>> difficult to program against as it is meant to be consumed by humans who
>> can process fancy things like colours, popups and buttons. When writing
>> acceptance tests I tend to bypass the UI and the Database so I can focus on
>> the requirements.
>>
>> Good luck with your efforts.
>>
>> On Friday, September 12, 2014 8:01:19 PM UTC+2, vivek poddar wrote:
>>>
>>> Hi Jakob Holderbaum,
>>>
>>> I am very glad that you are taking interest in my project :) .Its doing
>>> well actually I was a bit busy in my job but that should not be an excuse ;)
>>> that said I am wiring my app to Sinatra for web delivery.
>>>
>>> The interesting thing that I am noticing while working in this project is
>>> that *I have developed a lot of confidence that my code* *is going to
>>> work well*,
>>> thanks to those *UseCase * testing stuff, now I can feel my interactors

vivek poddar

unread,
Sep 17, 2014, 2:54:01 AM9/17/14
to clean-code...@googlegroups.com
Hi Jakob,

I think I am getting a bit confused now and its a good sing of learning right ;)

Let me summarize what I understood from you:

Interactor should play with entity object and not just the plain hash, but as I told there was one problem I was getting two different kind of objects while retrieving them from the repository in the url_exists? method. Also, I don't know much about the Gateway stuff so, pls provide me a good link to read from, but I can infer that you are saying to put a level of indirection in between repository and interactor right?


PS: I would really like you to just publish a simple application in your blog showing important concepts.

Cheers!




To post to this group, send email to

--
Jakob Holderbaum, M.Sc.
Systems Engineer

0176 637 297 71
http://jakob.io
h...@jakob.io
@hldrbm
--
The only way to go fast is to go well.
--- You received this message because you are subscribed to the Google Groups "Clean Code Discussion" group.
To unsubscribe from this group and stop receiving emails from it, send an email to clean-code-discussion+unsub...@googlegroups.com.
To post to this group, send email to clean-code-discussion@googlegroups.com.

vivek poddar

unread,
Sep 18, 2014, 6:25:00 AM9/18/14
to clean-code...@googlegroups.com
Hi,

I have pushed my work done so far here: https://github.com/vivekimsit/short_url

Thanks!

Jakob Holderbaum

unread,
Sep 19, 2014, 6:24:24 AM9/19/14
to clean-code...@googlegroups.com
Thanks.

I used this morning to jot down my ideas about persistence and entities
and how I think it fits into a hexagonal architecture. Probably it helps
you a bit on your journey: http://jakob.io/prsstnc

Cheers
Jakob

On 09/18/2014 12:24 PM, vivek poddar wrote:
> Hi,
>
> I have pushed my work done so far here:
> https://github.com/vivekimsit/short_url
>
> Thanks!
>
> On Wed, Sep 17, 2014 at 12:23 PM, vivek poddar <vivek...@gmail.com> wrote:
>
>> Hi Jakob,
>>
>> I think I am getting a bit confused now and its a good sing of learning
>> right ;)
>>
>> Let me summarize what I understood from you:
>>
>> Interactor should play with entity object and not just the plain hash, but
>> as I told there was one problem I was getting two different kind of objects
>> while retrieving them from the repository in the *url_exists? *method.
>>>>> email to clean-code-discu...@googlegroups.com.
>>>>> To post to this group, send email to
>>>>> clean-code...@googlegroups.com.
>>>>> Visit this group at http://groups.google.com/
>>>>> group/clean-code-discussion.
>>>>>
>>>>>
>>>>
>>> --
>>> Jakob Holderbaum, M.Sc.
>>> Systems Engineer
>>>
>>> 0176 637 297 71
>>> http://jakob.io
>>> h...@jakob.io
>>> @hldrbm
>>>
>>>
>>> --
>>> The only way to go fast is to go well.
>>> --- You received this message because you are subscribed to the Google
>>> Groups "Clean Code Discussion" group.
>>> To unsubscribe from this group and stop receiving emails from it, send an
>>> email to clean-code-discu...@googlegroups.com.

vivek poddar

unread,
Oct 30, 2014, 4:12:13 AM10/30/14
to clean-code...@googlegroups.com, mail...@jakob.io
Hi,

Thanks to @Jakob, I nearly completed my project but I think its far away from production use but its fine for a learning perspective.

The code can be found here: https://github.com/vivekimsit/short_url

What I am thinking now is to move on to some new project to keep away from boredom and to gain new perspective. Hope this time I will get some ideas or suggestion as well as few contributors too.

Thanks!
>>>>> To post to this group, send email to
>>>>> clean-code...@googlegroups.com.
>>>>> Visit this group at http://groups.google.com/
>>>>> group/clean-code-discussion.
>>>>>
>>>>>
>>>>
>>> --
>>> Jakob Holderbaum, M.Sc.
>>> Systems Engineer
>>>
>>> 0176 637 297 71
>>> http://jakob.io
>>> h...@jakob.io
>>> @hldrbm
>>>
>>>
>>> --
>>> The only way to go fast is to go well.
>>> --- You received this message because you are subscribed to the Google
>>> Groups "Clean Code Discussion" group.
>>> To unsubscribe from this group and stop receiving emails from it, send an

Frédéric Bouquet

unread,
Oct 30, 2014, 5:04:02 AM10/30/14
to clean-code...@googlegroups.com, mail...@jakob.io
Hi, very nice, just twitted the repository to my contacts.

What kind of project are you planning for the future ? I mean
functionnaly speaking ?

Cheers
>> >>>>> email to clean-code-discu...@googlegroups.com.
>> >>>>> To post to this group, send email to
>> >>>>> clean-code...@googlegroups.com.
>> >>>>> Visit this group at http://groups.google.com/
>> >>>>> group/clean-code-discussion.
>> >>>>>
>> >>>>>
>> >>>>
>> >>> --
>> >>> Jakob Holderbaum, M.Sc.
>> >>> Systems Engineer
>> >>>
>> >>> 0176 637 297 71
>> >>> http://jakob.io
>> >>> h...@jakob.io
>> >>> @hldrbm
>> >>>
>> >>>
>> >>> --
>> >>> The only way to go fast is to go well.
>> >>> --- You received this message because you are subscribed to the Google
>> >>> Groups "Clean Code Discussion" group.
>> >>> To unsubscribe from this group and stop receiving emails from it, send
>> >>> an
>> >>> email to clean-code-discu...@googlegroups.com.
>> >>> To post to this group, send email to clean-code-discussion@
>> >>> googlegroups.com.
>> >>> Visit this group at
>> >>> http://groups.google.com/group/clean-code-discussion.
>> >>>
>> >>
>> >>
>> >
>>
>> --
>> Jakob Holderbaum, M.Sc.
>> Systems Engineer
>>
>> 0176 637 297 71
>> http://jakob.io
>> h...@jakob.io
>> @hldrbm
>
> --
> The only way to go fast is to go well.
> ---
> You received this message because you are subscribed to the Google Groups
> "Clean Code Discussion" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to clean-code-discu...@googlegroups.com.
> To post to this group, send email to clean-code...@googlegroups.com.
> Visit this group at http://groups.google.com/group/clean-code-discussion.



--
Frédéric Bouquet
Twitter/Github : bouquetf
http://www.espacedefouille.org/

vivek poddar

unread,
Oct 30, 2014, 5:14:01 AM10/30/14
to clean-code...@googlegroups.com
Hi,

Thanks, but it may need some refactorings as I did some last minute changes after the @jakob's blog post. That said, I want some project from which I can gain much from architecture point of view, like web scrapper is not going to work so, somethings which can give me confidence to design new system. Let me give some outline:

1. Should be single page.
2. Should be RESTful.
3. Easy to scale.
4. Should have caching implemented, because nowadays I see a lot of noise on how to make your application faster.

And as always it should follow good testing ethics from beginning itself.

Hope you got it. :)

Thanks!

Frédéric Bouquet

unread,
Nov 6, 2014, 3:58:30 PM11/6/14
to clean-code...@googlegroups.com
Hi,

Just to say I've cloned the short url project to our new
https://github.com/cleancodeexamples repository

Cheers

vivek poddar

unread,
Nov 6, 2014, 10:21:25 PM11/6/14
to clean-code...@googlegroups.com
cheers :)


>> >> >>>>> To post to this group, send email to
>> >> >>>>> clean-code...@googlegroups.com.
>> >> >>>>> Visit this group at http://groups.google.com/
>> >> >>>>> group/clean-code-discussion.
>> >> >>>>>
>> >> >>>>>
>> >> >>>>
>> >> >>> --
>> >> >>> Jakob Holderbaum, M.Sc.
>> >> >>> Systems Engineer
>> >> >>>
>> >> >>> 0176 637 297 71
>> >> >>> http://jakob.io
>> >> >>> h...@jakob.io
>> >> >>> @hldrbm
>> >> >>>
>> >> >>>
>> >> >>> --
>> >> >>> The only way to go fast is to go well.
>> >> >>> --- You received this message because you are subscribed to the
>> >> >>> Google
>> >> >>> Groups "Clean Code Discussion" group.
>> >> >>> To unsubscribe from this group and stop receiving emails from it,
>> >> >>> send
>> >> >>> an

>> >> >>> To post to this group, send email to clean-code-discussion@
>> >> >>> googlegroups.com.
>> >> >>> Visit this group at
>> >> >>> http://groups.google.com/group/clean-code-discussion.
>> >> >>>
>> >> >>
>> >> >>
>> >> >
>> >>
>> >> --
>> >> Jakob Holderbaum, M.Sc.
>> >> Systems Engineer
>> >>
>> >> 0176 637 297 71
>> >> http://jakob.io
>> >> h...@jakob.io
>> >> @hldrbm
>> >
>> > --
>> > The only way to go fast is to go well.
>> > ---
>> > You received this message because you are subscribed to the Google
>> > Groups
>> > "Clean Code Discussion" group.
>> > To unsubscribe from this group and stop receiving emails from it, send
>> > an

>> > To post to this group, send email to

>> > Visit this group at
>> > http://groups.google.com/group/clean-code-discussion.
>>
>>
>>
>> --
>> Frédéric Bouquet
>> Twitter/Github : bouquetf
>> http://www.espacedefouille.org/
>>
>> --
>> The only way to go fast is to go well.
>> ---
>> You received this message because you are subscribed to the Google Groups
>> "Clean Code Discussion" group.
>> To unsubscribe from this group and stop receiving emails from it, send an

>> To post to this group, send email to

>> Visit this group at http://groups.google.com/group/clean-code-discussion.
>
>
> --
> The only way to go fast is to go well.
> ---
> You received this message because you are subscribed to the Google Groups
> "Clean Code Discussion" group.
> To unsubscribe from this group and stop receiving emails from it, send an

> Visit this group at http://groups.google.com/group/clean-code-discussion.



--
Frédéric Bouquet
Twitter/Github : bouquetf
http://www.espacedefouille.org/

--
The only way to go fast is to go well.
---
You received this message because you are subscribed to the Google Groups "Clean Code Discussion" group.
To unsubscribe from this group and stop receiving emails from it, send an email to clean-code-discussion+unsub...@googlegroups.com.
To post to this group, send email to clean-code-discussion@googlegroups.com.
Reply all
Reply to author
Forward
0 new messages