views:

150

answers:

8

Hi world,

I was wondering how you guys actually develop large applications when you are your own boss. For myself I have been learning the hard way the necessity for patience and hope. I have been working on implementing an application (in the form of a series of scripts linked to a database) that clusters wikipedia articles using a combination of knowledge of wikilinks and article text/content. I have been at it for two years now; no results yet.

I cant seem to get any results for I am continuously reengineering my scipts and db due to changes in either the essence (pseudo-pseudo code, the theoretical algorithm) or form (script, threads, db tables, the practical algorithm) of the algorithm. Basically, I find myself continuously learning from the mistakes I discover while implementing; the devil being in the details, so are the answers it seems.

Anyway, every time I reengineer a script or a table or something, I need to scrap all my documentation and script. I am now able to do this without fear, but it has made me hate programming (I hate the details).

I feel that reengineering is the way to go since I am thinking long-term and I wish to learn fast, but I am wondering if you guys have a similar programming experience or if you never really need or choose to have a better script come out of the death of the last one (like a phoenix).

The hardest part for me is scraping my documentation for I spend more time documenting than coding; I use documentation as a means to discuss issues and consider solutions; I use it to formulate implementable solutions. While if it would be but for me, I would not mind scraping it, yet I always write it as if it were to be published the next week for while developing a script, I also seek to develop myself; I also try, like those of you who participate to this website, to share my knowledge or wisdom with others.

Anyways, I have been developing at full speed these last 2 months, reengineering countless essays, scripts, tables, etc; my patience is running low for I seek results.

Any tactics, any help, any experiences or anecdotes you wish to share?

Thanks for your consideration!

+1  A: 

Since you are working solo, try to get feedback from someone else that knows enough to understand what you are trying to do. You will be surprised by things other people can come up with.

When working for pay it is somewhat easier because you have to get acceptance from your client, it is not as open ended as in your current situation.

Otávio Décio
Thanks. That is indeed wise advice. While I have started to submit my discussions to my friend (who is working to make psyco for 64 bit), I will indeed take your advice in asking him for some feedback. Actually, I also trying to get him to focus on my application's efficiency. Thx!
Nicholas Leonard
+3  A: 

keep a development log; this is the place to discuss details with yourself, work things out on paper, sketch documentation, make notes about current and future issues, remind yourself what you've tried and what you have left to try, and so on. It's also a good idea to always note what the 'next thing to do' is, so you don't waste time remembering/reviewing when you have time to work on it. Date each entry.

i have used this approach on a number of long-running, sometimes frustrating, one-man projects of durations varying from a few months to several years, and it helps keep me focused and it helps keep me from trying something more than once.

It also eliminated the internal pressure to document everything, which might be of great benefit to you.

think of it this way: notes to yourself about what you've done are useful to you, but detailed documentation intended for third parties for code that gets scrapped is a waste of your time.

Maybe this will help your OCD documentation neurons to shut up so you can solve the problem completely, then document the working solution - instead of continually re-documenting the latest prototype.

Steven A. Lowe
Ah yes, I can feel your wisdom. I will indeed begin to date my entries for my documentation is looking more so like a development blog. While I think you are right in that I should not waste my time on perfecting my documentation, I also see that practice makes perfect; I wish to better my writing.
Nicholas Leonard
Still, this is great advice; I will try to assimilate it. Thx
Nicholas Leonard
+1  A: 

I think the hardest part of software engineering (not programming per se) is finding the right balance between pragmatism in getting it done NOW and getting it done RIgHT.

There is a tendency among (good) programmers to always want to pull things apart and put them back together is a neater/cooler/cleaner/... way. This is a good thing ... except when it means everything ends up continually in pieces and the elusive goal of a working (and really neat) system drifts further away.

For myself, I have to force myself to accept that something are not perfect and settle for getting some results in a short time period. The best way of doing this I find is to set a series of short term milestones that lead to the eventual goal. The stick to meeting the milestones even if some other part of the project looks more tempting for a while.

Rob Walker
Again, I can relate to this need to make it neater/cooler/cleaner. I indeed find myself cleaning up my script just before I decide to reengineer its essence. While this can be counter productive, for those still learning like myself, it seems wisest to perfect the form if this seems to have
Nicholas Leonard
to have the potential to help me learn or assimilate a new scripting tactic. But I suppose, that I will need to eventually stabilize in that I will need to have established a style.
Nicholas Leonard
As for the milestones; I find it difficult to specify anything more than the next 1 or 2 milestones, for even these are likely to have their essence changed due to the discovery of much better solutions or important details that had not been considered.
Nicholas Leonard
While I do set milestones, I find it best to keep them abstractly ambiguous the farther into the future they seem to be. Thanks for the wisdom of balance between pragmatism and results! But what is pragmatism to you or you?
Nicholas Leonard
@[Nicholas Leonard]: sketch out your goal, visualize wild success, then concentrate on the next action and only the next action. Reevaluate periodically.
Steven A. Lowe
@[Steven A. Lowe]: Visualize wild success: sometimes I seem to lose myself into contemplation of my dreams and the effects of my application. Like anything, I guess it is a matter of finding the right dose. What I find most difficult is finding the will and patience to refactor, reengineer, etc. Thx
Nicholas Leonard
+1  A: 

A good motto in programming is 'be willing and happy to throw everything away at least once', usually more. I'm currently writing a complete shell from scratch for a new operating system and I'm about to completely scrap part of the design, I don't like how I'm handling built in commands vs loadable modular commands.

It sounds like you dove in, head first .. excited to get some code written. From what I gather, you did spend some time with psuedo code (I even use a big dry erase board) to determine the structure of your code .. but the code was not able to survive radical changes to said structure.

There may be some good reasons why you're working completely isolated. If its possible, as others have suggested, bring someone else in who understands the end result that you hope to accomplish and hammer out a new design. Keep in mind that you application has proven to be quite volatile, the new design should not make you throw everything out because a few things changed.

I think you're also falling victim to what is known as premature optimization. Try to get something put together that works, even if its horribly inefficient and clunky, then really spend some time looking at how things can be improved. This step is almost a precursor to a new design that could survive radical changes in the future. If you can't bring someone else in, a working model of your current mistakes is almost as good as another collaborator.

Tim Post
Oh yes, that saying is strong in me for I see that for those like me working on their own project, the willingness and capacity to reengineer seems to provide an application with the fastest evolution speeds.
Nicholas Leonard
I am happy that you are also scrapping your code in order to get it working significantly better: renegineering. Yet, unlike automation (here-and-there optimization), reengineering is risky for it is not certain that efficiency or effectiveness gains will be worth the effort (and risks).
Nicholas Leonard
As for the work with someone other than you suggestion: you guys have convinced me to get working on it! While I doubt I would find someone close to me able to help me with the clustering-algorithm (effect), I am putting someone on code efficiency and pragmatism; a fiend who I trust.
Nicholas Leonard
I am falling victim to premature optimization, but I am aware of it; I am still a child-developer, I need to practice and consider efficiency (optimization) for it will most likely be required when I will actually process all 20 million articles, not to mention the trillion of links! Thank you,
Nicholas Leonard
Have you considered just using one of the database dumps that Wikipedia makes available on a semi-regular basis just for testing? This might help you to get the core code where you need it, while thinking about how you'll scrape later. I think, once you get even a minimal prototype done, you'll fly.
Tim Post
@[tinkertim] Apparently, they have stopped making MySQL dumps. The only option seems to be to parse XML dumps. It is a pain. But I am currently refactoring my application so that I gather and sort all the data I am likely to need. This will require me to reflect on the pattern recognition part...
Nicholas Leonard
@[tinkertim] Actually, you were right. Wikipedia still does provide sql dumps for mySQL. I was blinded for I am using PostgreSQL. Anyway, thx!
Nicholas Leonard
A: 

Design Freeze!

Build the frozen design in tiny modules with min coupling - modules do ONLY one thing. When it works, you will be much smarter about how to fix any shortcomings. Minimum coupling and max coherence makes it easy to cut out defective parts. Don't scrap anything that works.

Regards, Bill Drissel

Indeed, I try to modularize in a way that maximizes code reusability, comprehension and simplicity. But sometimes, the abstract algorithm changes so much that I must scrap much. Yet, I am still learning about this programming, and its all a pain to me! I am indeed focusing on reusability. Thx
Nicholas Leonard
+1  A: 

I was wondering how you guys actually develop large applications when you are your own boss.

I started by writing pages and pages and pages of functional specification ... describing in various levels of detail (including the UI) what I wanted the software to do.

I also tried to minimize risk by writing some prototype, proof-of-concept software components of the riskest or least-well-understood bits.

Anyway, every time I reengineer a script or a table or something, I need to scrap all ...

I certainly do refactor what I've written (I've been working on this since 2005), but only to add new functionality. Note that "refactor" is a technical term (look it up: there are books about it): note that "refactor" isn't at all the same as "scrapping" what I've already written (instead, I'm modifying-it-and-adding-to-it).

I have been at it for two years now; no results yet. ... Anyways, I have been developing at full speed these last 2 months ...

I don't know how much experience you have as a programmer. Unless you're very experienced, some options are:

  • Take on a smaller project (don't expect to finish too big a project by yourself) ... the effort and skill to complete a project isn't linear with the project size (e.g. a project that's twice as big might be five times more difficult to complete)

  • Start, but don't expect to finish (it's a learning opportunity which you'll learn from)

  • Work with someone else

  • Work more slowly and methodically (if you're only going 100 yards you can just start running, but if you're going 100 miles then you need to prepare a map etc.).

The hardest part for me is scraping my documentation for I spend more time documenting than coding ...

Someone (not necessarily me) ought to reply this paragraph of yours, or perhaps you could say more about it.

I'm very interested in this topic (in fact the product which I've developing is for documenting software development), but I don't know what to reply to this particular paragraph of yours.

ChrisW
Ah yes, this is sound advice. I graduated with a degree in computer science. Unlike computer engineers, my main effort is on the pseudo algorithm; programming is to "make it happen". I have been programming for 5 years; I have focused on database based applications that deal with huge data sets.
Nicholas Leonard
I am discovering the necessity of developing the pseudo-algorithm while developing the actual implementation; like you said, I am also realizing the necessity to be methodical (patience and hope come into play!).
Nicholas Leonard
While it is mostly the necessity to know how to program well that motivates me into refactoring my code and db tables, it is the necessity to have an effective clustering algorithm that most often forces me to reengineer (scrap large pieces of code, docs and db).
Nicholas Leonard
I document for many reasons. While I call this documentation for it indeed explains the form of the application, these are mixed in with various discussions and observations. I am dealing with complex algorithms; I find that discussing what it is I am actually doing helps me to understand or see.
Nicholas Leonard
When I document, I will divide my discussions into sections identified by a title which might abstract an important issue, question, concern, or an element of the application (a db table, a layer, etc). Each section will then discuss the issues and possible solutions in order to conclude what to do.
Nicholas Leonard
All these documentation files or sections, I try to organize them hierarchically so that they remain part of a coherent whole. I also try to include much hyperlinks to the webpages concerning answers or considerations, but also to other parts of my documentation.
Nicholas Leonard
I also often include philosophical or metaphysical considerations, etc for while being a developer, this is only part of me; I try all of my parts linked together so that they complete each other. It is in my opinion that this world is to specialized; I try to relate what I learn to what I know.
Nicholas Leonard
With a 300-character limit on 'comments', this place doesn't support long two-way dscussions. If you want a longer dialog (instead of only a single question-and-answer) might like to post your question on a forum that supports dialogs e.g. http://discuss.joelonsoftware.com/?joel
ChrisW
@[Chris] Do you not see that it does?
Nicholas Leonard
A: 

Just make it work. Over time make it better, bit by bit. Take it as an opportunity to learn refactoring (in the strict sense--behavior-preserving transformations) and unit testing.

Willie Wheeler
+1  A: 

Release early, release often.

nezroy
Interesting. But what if you seek to challenge a giant? would it then not be wise to keep one's code among trusted friends? I have read wikinomics; I know the value of the collective intelligence inherent to peer review. Yet, since all you believe in this so much, I will compromise.
Nicholas Leonard
I will ask some close friends, but not the entire Living Web; oh no that would be too risky, I think. Nice link though. Thx!
Nicholas Leonard