Closed. This question is opinion-based. It is not currently accepting answers.
Want to improve this question? Update the question so it can be answered with facts and citations by editing this post.
Closed 8 years ago.
Improve this question
I have found a software development system which is currently free to use and develop with.
This system is completely codeless and one can develop business oriented applications effortlessly using its GUI and a bit of MDA. The site is : http://www.codeless.com/
But unfortunately it is in Dutch language.
I would like to know if anyone has ever used this product ?
How efficient is this approach and product?
Can one develop codeless applications?
I have looked at the site but the story is extremely vague.
For majority of non-Dutch speakers, I have translated the following text:
Klaar voor de toekomst!
Stel dat u over 20 jaar nog steeds
dezelfde software zou kunnen gebruiken
als nu. Toekomstmuziek? Nou, welkom in
uw toekomst dan. Want Codeless
Technology ontwikkelt software zonder
code die simpelweg niet veroudert.
Door ´reverse enginering´ kunnen wij u
laten zien hoe uw software-pakket er
in Codeless uit komt te zien. En door
gebruik te maken van interfaces,
kunnen we bepaalde delen van uw
systeem vervangen zonder dat er een
Big Bang implementatie noodzakelijk
is.
Wij hebben een manier gevonden om onze
software voor altijd mee te laten
gaan. Omdat we het simpelweg zonde van
uw tijd vinden om telkens opnieuw uw
bedrijfsprocessen te moeten uitleggen
aan een nieuwe ICT-leverancier.
Uw systeem is perfect aangesloten op
uw bedrijfsprocessen. En dat terwijl u
de nieuwste technologieën snel en
voordelig in kunt zetten om zo
concurrentievoordeel te behalen.
Natuurlijk moet u updaten. Maar met de
software die u nu door ons laat
bouwen, bent u gegarandeerd klaar voor
de toekomst!
That translates to:
Ready for the future!
Imagine you are using the same
software in 20 years. Impossible? No,
welcome to your future. Because
Codeless Technology creates software
without code that does not age.
By 'reverse enginering' we show you
your software in Codeless. By using
interfaces, we can replace certain
pieces of your system without the need
for a Big Bang implementation.
We have found a way to let our
software last for ever because we
think it is a waste of your time to
explain your business processes to
your ICT supplier again and again.
Your system is perfectly connected to
your business processes. And still you
are able to use the newest
technologies quick and easy so you
have an advantage on your competitors.
Of course, you still have the need for
updates. But with our software, you
are guaranteed future ready.
It looks like they have developed a product that uses an existing system and creates a new one using the old system as guide. Without the need to write code. This looks great, but I have serious doubts.
My first question: if they are so excellent, why is their site not in English?
I'm not familiar with this specific product, but I have some familiarity with the "theory" (such as it is) of codeless development.
The primitives of programming languages are there for a reason. So there is a tendency for "codeless" or "mouse-based" development systems to gradually accumulate features that correspond to the primitives of programming languages: something similar to function calls (for reuse of pieces of a design), references to parameters within functions, things that loop, conditional branching, things that aggregate several actions into a single action, things that do arithmetic or string operations, etc. By which point they end up with the same issues as all development systems, which all derive from the tendency of users to push the envelope in looking for ever more complex problems to solve. So then they need refactoring and other nice IDE-style features to help them manage the complexity - by which time the "codeless" distinction is more to do with marketing than actual user experience.
We even see this tendency in many attempts to "start again" with a new set of primitives in a text-source programming language. Haskell does not truly eliminate procedural, stateful coding. It has a way of mimicking such capabilities that tastes pretty authentic - because if it didn't, users would try to simulate it themselves and get it wrong.
I've done some reading on their site.
It seems to me that they build software for you, which they claim you can expand effortlessly. I don't see that they claim you can use their software te build your own software without using code. Their concept in their words:
Maatwerksoftware, die nooit veroudert, die u zelf kunt onderhouden én uitbreiden en die bovendien wordt gemaakt waar u bij staat.
That is:
Software built to your requirements, that never ages, that you can maintain yourself, and that on top of that is made while you're watching.
I conclude that they build it, not you.
I've used the visual development tool of the C Control microcontroller. Although it was possible to use almost every feature of the underlying language (BASIC) it found it to be a waste of time. "Mouse coding" simple loops took way longer than just writing the plain BASIC code.
During my first steps into coding and development I tried other products, (mostly game creators) but they always either lack the features normally available in a coded language or are very slow to work with.
But during the last years I noticed an increase of people who are no longer willing to read (natural) text which they cannot understand the first time they read it. Just a single subordinate clause and they don't want to continue.
So I guess there is a market for these kind of codeless development tools, since you can easily get results and the learning curve is much lower. Most tools I used where pretty self-explanatory.
IMHO codeless development enviroments are best suited for
beginners
people who don't want to learn coding
This approach looks great, worth a consideration. Even though it's still at an experimental stage: http://subtextual.org/subtext2.html
The results of "codeless" or "graphical" systems that I've seen always end up not reducing real complexity, with the drawbacks of no collaborative effort, cant diff/patch, can't do a version compare, difficult to put in source control, etc.
In short, just not a well thought-out.
I'll bet that they don't scale well to large data sets either.
I have tested version 1 current version is 2. but as there is not documentation available in English I am a bit baffled as to how we can go ahead building our apps as per our requirements.
The samples provided looked impressive though.
Just my two cents, the idea behind codeless development is not only for beginners/people who don't want to learn coding, but also can be used to teach younger children programming, and utilize it as a storytelling medium.
I am,of course,referring to Alice.
It has it's market, but I don't forsee it taking over traditional programming (eg. typing on the keyboard) due to it's clunkiness.
The appropriate stance with these sort of products is extreme scepticism. I distinctly remember this...
The Last One
Which was a product, released in 1981(!) which claimed to make programmers redundant by generating commercial applications codelessly.
That said, I am currently using a codeless development environment - Wirefusion - for generating 3D interactive java applets. It's extremely good, but it's targeted at a very well defined domain and even there has some issues.
There was Borland's ObectVision in the late '80s.
You can download a copy from an abandonware site.
Something like Scratch or Lego MindStorms is what comes to mind when thinking about codeless software. But this seems like helping someone to code instead of being 100% codeless. And I think that is the way it will have to work in order not to be so limiting. Over time, like all languages/APIs it will improve and more and more people will come out with their own buckets of coding blocks to make it more versatile. No matter what happens though I would always like a way to tweak all generated code, much like a WYSIWYG HTML editor. It will be difficult at first but will only get better with time. But no matter what, coding by hand will always reign supreme.
Replying to the post of geocar..(cant reply anymore to my own post)
To say what the differences are with other I4GL is hard since i dont know all the tools out there, but let me put it this way. If one compares Codeless to MS CRM 4.0 and Microsoft M, what would you think are the differences with I4GL tools?
The proof is in the pudding; I don’t understand why this Bernard deleted who we are. If Charles Simonyi the Billionaire ex-Microsoft guru who has been trying to do the same for 15 years would comment here, would he be deleted?
David Roth, Chief Visionary, Simparel, Inc.
David.Roth at Simparel dot com.
My boss has a good way to generate apps without his having to write code. He has an automatic programmer (me) write it for him. He uses domain-specific language, and gets a working app. Anything that does the same job would have to be about as smart (or dumb) as that.
When requirements are communicated, a language of symbols is used, whether it is keyboard clicks, mouse clicks, or any other form of input.
If a language maps well onto user concepts and allows very little room for misinterpretation or inconsistencies, then it is a good domain-specific-language.
It is good to try to find better domain-specific-languages.It is bad to try to sell one if you don't have one.
So I guess there is a market for these
kind of codeless development tools,
since you can easily get results and
the learning curve is much lower. Most
tools I used where pretty
self-explanatory.
IMHO codeless development enviroments
are best suited for
beginners people who don't want to
learn coding
That is exactly true - and what is accomplished by the neatComponents codeless development platform.
Have a look at www.clearString.com which is targeted at those users
David
Encanvas is completely codeless. It was originally created back in the day to author enterprise-grade situational applications but in the last decade has been used to build anything from spreadsheet replacement type apps to regional traffic systems, business intelligence platforms and eLearning applications.
encanvas doesn't come cheap. It's engineered to enable IT teams to move away from coding and comes with all of the tools you'd expect including cloud deployment.
encanvas is built on .net.
Related
So I've been programming in PHP for the past 7 yrs. What I should be doing is learning OOP but all the talks about RoR and Django interest me even more. With that said, I started to follow RoR when it first came out. I knew of it through 37signals when I was first introduced to their products. At the time, I continued to use PHP, it was what I knew and I was able to produce code much faster than trying to learn a new language.
Fast forward to 2009 ... it was a few yrs ago when Twitter made headlines, when they implemented Scala due to RoR's inconsistency. My question, have things gotten better for RoR? I know I shouldn't go by one company's issue but of course the fanboys will probably jump all over this and bash or pump one language over another.
I would assume by now lots of bug fixes and enhancements have been made, but I would still like to hear what annoyances there are with RoR that still needs to be addressed.
TIA!
Twitter's problems were not with Ruby or with Rails, and they have explained this at length.
This is becoming one of those various urban legends that everyone "knows" to be true, but isn't. It's quite hard to google for the story here, probably because of all the "follow me on twitter" buttons. Fortunately, a Stack Overflow answer referenced a detailed discussion on this that included Twitter developers.
I will give one other urban legend example that is (via RSI) somewhat programming-related: the Dvorak keyboard. Everyone knows that QWERTY is designed to be inefficient, to slow down the operator, and that it is an example of market failure, right?
Another urban legend: Dvorak vs QWERTY
Turns out this legend is not just completely false, but it has been deliberately, deceitfully falsified. Yes, the US Navy did test the patented Dvorak keyboard in 1944. But according to this report on the Dvorak keyboard:
How can we take seriously a study
which so blatantly seems to be
stacking the deck in favor of Dvorak?
And, indeed, there appears to have
been good reason for that deck
stacking.
We discovered that the Navy's top
expert in the analysis of time and
motion studies during World War II was
none other than...drum roll
please...Lieut. Com. August Dvorak.
Earle Strong, a professor at
Pennsylvania State University and a
one-time chairman of the Office
Machine Section of the American
Standards Association, reports that
the 1944 Navy experiment was conducted
by Dvorak himself.
Later tests by other organizations showed no advantage for Dvorak. It is also worth noting that slowing down typists was not a goal even in the early days of the typewriter. Actually, typing speed contests were conducted regularly with great publicity and the fact that typists were fast on QWERTY was a factor in the adoption of QWERTY.
Dvorak and Twitter and RoR
The false version of this story has been repeated for literally 65 years now, partly because almost no one cares about original sources, they just repeat the version they heard. Another parallel with RoR and Twitter is the religious/political angle. People have language and framework loyalties, and they have economic system loyalties, and the enduring legends play into existing bias. The Twitter story connects with some people's emotional perspective on the expertise they do and do not yet have; the QWERTY story connects with some people's personal dislike of free market economics.
Twitter switched some parts of their architecture from Ruby to Scala because when they started they used the wrong tool for the job. They were using Ruby on Rails—which is highly optimised for building green field CRUD Web applications—to try to build a messaging system. AFAIK, they're still using Rails for the CRUD parts of Twitter e.g. creating a new user account, but have moved the messaging components to more suitable technologies.
Your best bet is going to be working through a little prototype app. Rails is pretty nice once you get the hang of it. Though that is a similar truth to many frameworks.
Take a little piece of your app that's either easy or hard in php, and try to write it in rails. It shouldn't take too long and should give you a good real world example.
Personally these prototypes are my favorite. Systems with no users are the easiest to write.
Well, it's not only twitter that is based on Ruby on Rails. There is a long list with successful new projects - http://storecrowd.com/blog/top-50-ruby-on-rails-websites/ .
May be the only annoyance referenced by lots of users is the performance. However Ruby 1.9 addresses that problem and is compatible with most of the libraries already. Furthermore performance problems are function of Developers' programming knowledge in most cases and rarely a function of programming language speed.
My advice is just to give it a try for a week or two :)
Are you planning on having a site as heavily trafficked as Twitter?
If not, why are you worrying about issues that only came up under massive load?
I've always been interested in writing and designing programming languages. Of course, it's pretty difficult to find an employer that will let you write a programming language as part of your job. So I'm looking for the "next best thing".
What fields of programming will let me get some experience solving some related problems? Or what kinds of employers are most likely to view all of my dinky little interpreters as relevant experience?
If your interest in language design is irrepressible, get a Ph.D. and make it your area of research. You can count on academia to support all manner of unprofitable activity.
None. The bulk of the professionals in that field do not design languages for a living, but retarget existing compilers to new (usually embedded) targets, or work on source2source conversion systems for legacy code, making a few language extensions in the process.
You should really ask yourself if you want this, because, besides from an extremely lucky shot, that is the realistic outlook of what you will do if you go into this industry.
Remember that the big public toolchain industry is not very profitable at the moment, and that maybe a good 100 languages are in largescale pulbic use and continually maintained, after 30 years of programming languages creation.
I know this is is very gloom, but I hope it sets you on the path to chuck the romantic, hobbyist view, and start researching how the real world in this field looks like.
Moreover, having done small hobby projects on your own is not really a pre. You need to show that you can work on large projects in a team, more than that you can create a small interpreter on your own. If you really want to pursue this, I'd recommend:
stay in school, and get a bachelor (preferably a master or PHD) in CS.
join some opensource team that works on a significant project in the field. gcc, but also the Java world, Tracemonkey (Mozilla), Mono etc. Verifiable experience in real world scenarios is very important.
I think the best way to get into this type of work would be to undertake an advanced degree with a specific focus on language design, compilers etc. It's going to be very tough for you to walk in off the street into a private company and start writing new language features otherwise.
You could also shoot a little higher and on your own, or with a small team, produce something that is much more than just a dinky little interpreter. Show your potential employer that you can produce something useful.
I have worked as an embedded programmer for the past ten years. Before that I wrote compilers (and assemblers, linkers, debuggers, etc.) for 20 years.
My co-workers joke that I turn every problem in to a parsing problem. And they're right. I've used techniques that are appropriate for language design many times during the course of my career.
Today, I play around with compiler stuff on the side: http://ellcc.org. It helps me scratch my language itch.
Actually, there is a fair bit of work going on with visual programming. It isn't exactly traditional programming language work as we know it but there is a need for it. For example, a lot of advanced data analysis tools rely on visual programming tools (Pentaho). You don't have to look too hard to find good practical uses of visual programming.
To get into visual programming languages, you will need to do an advanced degree with an advisor in the area. You will need to do some human computer interaction / interface work in addition to the programming language stuff.
An employer that has a rich "domain" (i.e. a complex industry) can benefit from a "domain specific language".
Will they realise this? Unlikely. They'll be too likely trapped in their deep domain (and entrenched legacy systems) to see that a targeted language could help unclog the mire.
But if you bury yourself in a complex industry for long enough to gain rich domain knowledge you may then be able to turn them with your own skunkwork DSL. Slim chance.
Stay in academia. If you want to develop a new language your chances of being paid to do so are vanishingly small. Newer languages tend to be expressions of a novel problem domain, and you only really encounter the chance to develop them where (a) novel problems are part of the scenery, and (b) no-one is troubled by the necessity to actually earn a living.
Please take your time over it, as well. Speaking as a jobbing developer, the last thing I need is another blasted language to learn :-)
In static analysis there is a lot to do, and the problems that come up are related to those that interest you.
Most currently popular languages came out of a geniune NEED to scratch a particular ITCH. Python came about because some non-C programmers NEEDed to customize inputs their C programs and libraries. Lua came out of the NEED to embed a scripting language in to C programs. Erlang was created to address the NEED of 99.9999999% uptime, hot code loading, and highly concurrent execution. Perl came out of the NEED to easily write programs that parsed text files.
So the very simple question any employer will be asking themselves, and you should ask yourself is. What NEED can I supply a solution to that doesn't exist. Hobby work very seldom shows that you are providing solutions to a NEED, most of the time it is showing that you like to re-invent the wheel for the sake of re-inventing the wheel.
Closed. This question does not meet Stack Overflow guidelines. It is not currently accepting answers.
Questions asking us to recommend or find a tool, library or favorite off-site resource are off-topic for Stack Overflow as they tend to attract opinionated answers and spam. Instead, describe the problem and what has been done so far to solve it.
Closed 9 years ago.
Improve this question
I've been browsing Bjarne Stroustrup's new introductory programming book, Programming: Principles and Practice Using C++. It's meant for first-year university computer science and engineering students.
Early on in the book he works through an interesting extended example of creating a desktop calculator where he ends up implementing an arithmetic expression evaluator (that takes bracketed expressions and operator precedence into account) in a series of co-recursive functions based on a grammar.
This is a very interesting example, although arguably on the complex side for a lot of beginners.
I wonder what others thing of this particular example: would learning programming by seeing how to implement an expression parser excite and motivate you, or would it discourage you because of all the details and complexity?
Are there other good "real" programming examples for beginners?
When I was first learning to program, the best example I ever worked with was building a text adventure game from scratch. The basics just required knowing how to display text on the screen, receive input from the keyboard, and rudimentary flow control. But since text adventures always have room to add more features/puzzles/whatever, they can be easily adapted to explore aspects of whichever language you're learning.
Of course, not everyone finds games more interesting than calculators. It really depends on the programmer.
First, let me say that cognitive psychologists have proven in numerous studies that the most important factor in learning is desire to know.
If you want to learn about programming, you need to find a domain that stokes your desire to understand. Find a challenge that can be solved with programming.
I agree with the other folks when they suggest something that you are interested in. And games seem to be a common thread. As I reflect on my experience learning to program (too many years ago), math problems and a simple game was involved.
However, I don't think I really understood the power of software until I created a useful small program that helped a business person solve a real problem. There was a tremendous amount of motivation for me because I had a "client". I wasn't getting paid, but the client needed this program. There was sincere pain (gotta get my job done quicker) related to this situation.
So my advice is to talk to people you know and ask what small annoyance or computer-related obstacle to they have. Then try to fix it. It may be a simple web widget that reduces repetitive, manual tasks for an office worker.
One of my best early works was helping a little printing shop (no software, circa 1985) that struggled with estimating jobs to produce proposals that weren't money-losers. I asked alot of questions of the sales lady and of the operations manager. There was obviously an intersection of a common pain point with a really easy calculation that I could automate. It took me a couple of days to learn Lotus 1-2-3 (spreadsheet for you young-uns) enough to write a few macros. I was motivated. I had passion. I saw where I could make a difference. And that, more than anything else, drove me to learn some simple programming.
Having real people, real problems, and really simple solutions could be the inspiration you need as a beginning programmer. Don't try to write an accounting system. Just take one discreet piece of someone's frustration away. You can build on that success.
So, I wouldn't focus on the technique (yet). Don't worry about, "Am I doing this the most efficient way?" The main objective for a beginner is to have success, no matter how small, and build confidence.
BTW, that Lotus 1-2-3 set of macros grew into a full job tracking system. Very archaic, limited features, but made that little print shop much more profitable.
Create your motivation, fuel your desire, and develop your passion for programming like an artist unveils the masterpiece in a blob of clay. And be persistent. Don't give up when challenged with a roadblock. We all get stumped sometimes. Those are some of the best learning moments because humans learn more from failure than success.
Good luck.
I think making tiny games like text version of Tetris will be a good way of getting into pragramming world.
Board games are fun to design and code since they come in many shapes and difficulties
from tic-tac-toe to checkers to monopoly, its reinventing the wheel for educational purposes!
the best advice i can think of is to pick something from a field of interest you have because coding for the sake of coding might dim your resolve
Start small. Do examples that interest you. Stretch yourself just a little every time. Get comfortable with each step, to the point that you have confidence that you know what you're doing, and then try something a little harder the next time.
I think that any example program would help you learn a new language, but a beginner should try to work with something that is easy to understand in the real world, such as a mortgage calculator or something along those lines.
I think the answer is that it would depend on the person who is learning how to program.
One nice thing about something like an arithmetic expression evaluator is that it is a project that can start very small (make it work with just the format "X SYMBOL Y" where X and Y are single-digit numbers and SYMBOL must be a plus sign) and then you are slowly expanding the functionality to the point of a complicated system.
However, it might not be a great starter project for someone who doesn't really understand the concept of computers (hard disk, memory, etc.)
Try to think of something that you do on a computer that is repetitive, and could be easily automated. Then try to come up with how to make a program that automates that task for you. It can be anything, whether it's popping up a reminder every 15 minutes to stretch your legs or cleans up your temp directory on a regular basis.
The problem with this task is that it's conplex and not real life related. I don't need another calculator.
But once I had a CD with scratched surface near its center and lots of valuable JPEG files inside. I dumped the data from the unscratched part of the disk but all the filesystem was surely lost. So I wrote a program which analysed the dump and separated it into files. It was not very simple but was a nice and exciting file IO programming exercise.
Examples can be more complex than something you try to write yourself. It's easier to follow someone else doing something than it is to do it yourself. A real-world example like this calculator may be a fine way to introduce someone to a language. For instance, Practical Common Lisp starts with an example of an in-memory database (for CDs I think) and uses that as the springboard to explore parts of the language.
I prefer seeing a real example built up over time than just a lot of simple "Hello World" programs.
I've always found that implementing a game of some sort is sufficient incentive to learn various features of a language. Card games, especially, because they generally have simple rule sets to implement, but are sufficiently complex from an abstract point of view.
I would agree, though, with everyone else: find examples of things that interest you. Not everyone is a game fan, but something like a mortgage calculator would be far more interesting.
I want to go backwards and learn more about how compilers, processors and memory operate on my programs. I am also interested in the physics on which all of this depends. Any good references or books would be appreciated...
For compilers, the ultimate book is the Dragon Book, aka Principles of Compiler Design. It is a bit heavy going at first, but it becomes easier with each pass you make at it. It's a classic and should be read by all serious students of programming/computer science.
My first suggestion was going to be Code which has been suggested already. A better, but harder, book on the subject of processors is Computer Organization & Design by Hennessey & Patterson. You might look for an older edition on Amazon or Half.com. They'll be a lot cheaper and have basically the same information.
These will both teach you the basics of how a processor works, assembly language, etc. This will help you understand how your program will be interpreted and thus, what sort of performance bottlenecks might exist based on your design.
It sounds to me like you want to get a Computer Science degree. :-)
The simplest introduction , and very well written is Code by Charles Petzold
alt text http://ecx.images-amazon.com/images/I/31t68r9K28L._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU01_.jpg
I don't normally think of physics and compilers at the same time.
This link might get you thinking.
Write a simple emulator for something like C64. By thinking of how to emulate the CPU, Memory and other Chips you will learn how these simple machines worked. Today's computers pretty much operate in the same manner with a lot more complexity but the basic idea is the same.
Your emulator doesnt have to be super fast - try and get the C64 welcome message up and if you did your code right - you should be able to POKE and write basic programs and have them work :)
10 PRINT "DONT LISTEN TO ME - APPLE //E's RULE"
20 GOTO 10
I would suggest learning enough assembler to be able to write a simple Hello World program in assembler.
This will teach you exactly how the CPU works at the register and memory level.
It will also give you a good introduction into how source code is converted to object files and how the linker brings together all these object files together to create a working program.
Pick up any of the Hennessy & Patterson books.
Computer Architecture - A Quantitative Approach or Computer Organization & Design - The Hardware Interface
Feynman has a nice bit on the Physics of Computation:
which addresses the second part of your question.
Pick up a book on "Computer Organization" or "Computer Architecture" on Amazon. This is what we used when I was in college. It's not too thick, and will give you the basics, from the gate level all of the way up to how memory is organized and programs are written. If, after this, you want to look deeper into the physics, then you'll want to pick up a book on semiconductor physics. (But if I were you I'd just start by looking up "logic gate", "diode", and "transistor" on wikipedia!)
If you really want to get into the physics of processors/ IC's, you need to have a solid electromagnetics/circuit analysis background. It's certainly not easy stuff, and won't really make you a better programmer. If you're really interested, borrow some books from an EE friend!
An abstraction up from that is the gate level, which programmers can usually grok since it's all about logic.
I made a similar resolution after reading Steve Yegge's recommendation to learn about compilers. I've been really enjoying Nisan and Schocken's The Elements of Computing Systems: Building a Modern Computer from First Principles which is first a textbook, second, a one-semester course for freshmen or seniors, and third, a website providing the lectures and cross-platform emulation-simulation software: http://www1.idc.ac.il/tecs/ (TECS)
The topics go from NAND (programming digital logic circuits in HDL), up through flip-flops, ALUs and registers, assemblers, parsing and compilers, operating systems, and GUIs. You, the student, implements every one of these topics on the hardware simulator or software emulator provided on the website. To me, it is a celebration of human ingenuity that this range of ideas can be so deeply covered in 3--4 months by undergrads. One of the authors/professors gave a Google Tech Talk on the subject that's worth checking out if you have an hour to spare away from their course.
I can't recommend an equally-compelling resource for the physics of computation, but I can perfunctorily say that my electrical engineering department's first two core EE courses students could take (simultaneously if they chose) were Circuits 1 and Semiconductors 1. The former dealt with voltage, current, inductors, capacitors, op amps, etc.---while the latter dealt with quantum mechanics, crystals, doping, charge carriers, etc., and most directly spoke to the physics of digital processing and storage devices. It's difficult for me to imagine a hands-on simulation environment like TECS for such a topic, though, making it more appropriate for academic than hobbyist/professional study?
Closed. This question is opinion-based. It is not currently accepting answers.
Want to improve this question? Update the question so it can be answered with facts and citations by editing this post.
Closed 3 years ago.
Improve this question
In pair programming, the experience of every member of the team can be spread to new member. This experience is always in sync with the code, because the "senior" of the pair knows how the code works and what the design is.
So what is the utility of design documentation in this case ?
UPDATE
I don't imply no design, I imply no documentation.
With a team which practice pair programming I think that everybody is disposable, because everybody knows the code. If the senior developer leaves, I think that there is always at least one person who knows the code, because the experience was shared before.
What if your team is larger than 2 persons?
Just because two people know a part of a system does not mean it shouldn't be documented.
And I would be glad to know that I don't have to remember every tiny detail of a system just because it it's stored nowhere else than in my head.
For a small system this might work, but as the system gets larger, your limiting yourself and your colleagues. I'd rather use the memory capacity for a new system than to remember everything of the old system.
Have you ever played "telephone?" I don't think you should play it with your codebase.
What if the senior programmer leaves the company/project?
The set of deliverables should be decided independently of whether you use pair programming or not.
Six months or two years later, all the people involved could be in a different project (or a different company). Do you want to be able to come back and use the design documentation? Then, produce it. If you don't want to come back, or the design is simple enough that with the specs and the code you can understand it without the aid of an explicit design document, then you may skip it.
But don't rely on the two people explaining the design to you one year later.
Maintenance. You can't expect the team to remain static, for there to be no new members or loss of old members. Design documentation ensures that those who are new to the project, that have to maintain it years down the line, have information on decisions that were taken, why the approach was chosen, and how it was to be implemented. It's very important for the long term success of a project to have this documentation, which can be provided via a combination of traditional documents, source comments, unit tests, and various other methods.
I don't see that pair programming makes design documentation obsolete. I immediately have to think about the Truck factor. Sure, the senior may know what the design is. But what happens when he is ill? What happens when he gets hit by a truck? What if he is fired?
Pair programming does spread knowledge, but it never hurts to document that knowledge.
Who knows about the first-written code? The answer is nobody knows, because it hasn't been written. The reason it hasn't been written is because nobody knows what to do, hence the need for a design document.
Pair programming is just two people sharing one computer. By itself, it says nothing about what kind of design methodology the pair(s) uses.
Pair programming, when taking as part of "Extreme Programming", means following the Extreme Programming guidelines for design. This typically involves gathering and coding to "user stories". These stories would then stand in place of other design documentation.
The experience of people may be in sync with the code, as you say. But the design decisions are not all captured in the code - only the choices made are there.
In my experience, to really understand why code is designed the way it is, you need to know about the design choices that were not selected, the approaches that had tried and failed etc. You can hope that the "chinese whispers" chain transmits that correctly, given that there's no record of this in the code to refresh memories or correct errors...
... or you can write some documentation on the design and how it was arrived at. That way, you avoid being taken down a dark alley by the maintenance programmers in future.
Depends what you mean by "design documentation".
If you have functional tests - especially behaviour-driven development (BDD) tests, or Fitnesse or FIT tests then they're certainly a form of "active documentation"... and they certainly have value as well as being regression tests.
If you write user stories and break them down into tasks and write those tasks on cards for pairs to do then you're doing a form of documentation...
Those are the two main forms of documentation I've used in XP teams that pair on all production code.
The only other document that I find quite handy is a half-page or so set of bullet points showing people how to set up the build environment for a development machine. You're supposed to maintain the list as you go along using it.
The code base may be so large you can't humanly remember every detail of what you were intending to implement. A reference is useful in this case.
Also, you need a design if you are interacting with other components etc.
Well if you want a spreadsheet program instead of a word processor a design doc use useful :-)
XP, pair programing, agile, etc... do not mean you do not have a plan, it is just a far less detailed plan (at the micro level) of what is going on. The use cases that the user picks are more of the design, and it is more of a living document than with other styles of design/programming.
Do not fall into the trap that because youa re doing something "cool" that you no longer need good practices - indeed this style of programming requires more discipline rather than less to be successful.
Pair programming is an opportunity for the team to avoid having to spend a large proportion of the project time on documenting everything. But the need for documentation depends on how good you are at remembering the important stuff and how good your code is. You may still want lots of documentation if the code is difficult to work with.
You could try some experiments:-
Document a couple of small parts of
the design and note how often you
have to refer to it.
Document stuff that is always a pain
to work with.
No Nor does lack of pair programming mean you need documentation. Documentation is needed! What it looks like may surprise you!
An agile team will decide when and what documentation is needed. A good rule of thumb, if no one is going to read it, don't write it. Don't get caught up in the waterfall artifact thinking by provide artifacts because the Project Manager says so.
Most think of documentation as something you do with Word. If an agile team is working properly, the code itself, with TDD (test driven development) will have a set of automated test that document and enforce the requirements. Image, documentation that is in sync with the code ... and it stays that way.
Having said that, pairing does help domain, application, practice and skill knowledge propagate through the team very quickly. Pairing also helps ensure that the team follow the engineering practices including TDD and other automated test. The results are that the application remains healthy and future change is easy to bring about.
So, bottom line, pair programming produces better documentation. It does not eliminate documentation (although you might not be able to find a Word document).
I am a pro-advocate and a fan of documentation. Pair programming does not require "one senior developer". In my experience with pair programming, developers of all levels are paired together, for the purpose of rapid development. There are many times I worked with junior developers and would trade off on the keyboard. There are many times I worked with senior architects and would trade off on the keyboard. Documentation is still necessary, especially with your core components and database.
Pair Programming only enables your coding and logical aspect.
But documentation is good practice. Always do documentation...