<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://www.atalasoft.com/cs/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Rick Minerich's Development Wonderland : ideas</title><link>http://www.atalasoft.com/cs/blogs/rickm/archive/tags/ideas/default.aspx</link><description>Tags: ideas</description><dc:language>en</dc:language><generator>CommunityServer 2.1 SP1 (Build: 61025.2)</generator><item><title>Image Processing as Sets of Transformations</title><link>http://www.atalasoft.com/cs/blogs/rickm/archive/2009/04/27/image-processing-as-sets-of-transformations.aspx</link><pubDate>Tue, 28 Apr 2009 00:21:00 GMT</pubDate><guid isPermaLink="false">647108ca-f046-4d8d-9feb-a7fbd2049b37:18366</guid><dc:creator>RickM</dc:creator><slash:comments>1</slash:comments><comments>http://www.atalasoft.com/cs/blogs/rickm/comments/18366.aspx</comments><wfw:commentRss>http://www.atalasoft.com/cs/blogs/rickm/commentrss.aspx?PostID=18366</wfw:commentRss><wfw:comment>http://www.atalasoft.com/cs/blogs/rickm/rsscomments.aspx?PostID=18366</wfw:comment><description>&lt;p&gt;In the image processing world, like most computational problems, we often think our work is composed of only two basic ideas: representation and transformation.&amp;nbsp; Of course, one may have many layers of both representations of transformations and transformations of representations which can make things appear quite complex at times. &lt;/p&gt;  &lt;p&gt;However,&amp;nbsp; the problem is much more simple than it appears.&amp;nbsp; This is because a representation can be considered as a transformation from a zero or identity state.&amp;nbsp; Thus, in writing a symbolic language for image processing, we are left with only a single idea to consider:&amp;nbsp; transformations.&amp;nbsp; By composting layers of transformations we can apply image processing techniques in way which is not only bidirectional and platform agnostic but also comes along with a host of other benefits.&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Let us consider a simplified example of processing an image:&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;1) We read in a file (representation) and use a codec (transformation) to convert it into a format understood by our API (representation).&lt;/p&gt;  &lt;p&gt;2) We then perform some type of algorithm on that data (transformation) which results in some type of output (representation).&lt;/p&gt;  &lt;p&gt;3) Finally, via another codec (transformation), another file is saved to disk (representation). &lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;In most cases there are a great number of intermediate representations.&amp;nbsp; Each is a full copy of the previous iteration with whatever changes have been so far applied.&amp;nbsp; Essentially, the same information is copied over and over again in memory.&amp;nbsp; We do allow for some kinds of in-place processing, however, this is bad as when the operation has been completed, the previous representation has been destroyed.&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;Instead, what if we batched up sets of transformations?&amp;nbsp; This could have many benefits:&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;1) The most obvious benefit is that of parallelization.&amp;nbsp; Even at the simplest level of functional composition, these transformations could be handed off to a cluster for asynchronous processing or saved for a later batch processing job.&lt;/p&gt;  &lt;p&gt;2) With an intermediate symbolic transformation language, processing algorithms could potentially be combined and reduced to produce a single transformation out of many.&amp;nbsp; This would significantly reduce the processing overhead as well as the number of intermediate memory representations.&lt;/p&gt;  &lt;p&gt;3) An intermediate symbolic language which encompassed both codec and processing may make it possible to push the processing transformation through the codec transformation and in so doing no longer need to have any intermediate memory representation.&amp;nbsp; This could provide significant memory and processing speed time benefit.&amp;nbsp; &lt;/p&gt;  &lt;p&gt;4) The intermediate symbolic language could be saved into the files themselves thus removing the need for the codec to be present on the end machine.&amp;nbsp; Admittedly, the user would also need the image language interpreter. &lt;/p&gt;  &lt;p&gt;5) Instead of applying simple image processing algorithms to an image, the symbolic representation could be appended to the end of the file.&amp;nbsp; This would be quite similar to layers in practice.&amp;nbsp; In this way it would be possible to view the image at all stages of transformation. &lt;/p&gt;  &lt;p&gt;6) For large or proprietary transformations, the representation could be kept on the internet and either be downloaded or, in the case where the owner did not want to expose their algorithm, a flattened representation could be sent out and a processing delta could be sent back.&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Conclusion &lt;/b&gt;&lt;br&gt;&lt;/p&gt;  &lt;p&gt;Of course, when I speak of data I don’t only mean the image itself.&amp;nbsp; This technique could also be applied to many classes of data or algorithm.&amp;nbsp; Most notably for us, image metadata.&lt;/p&gt;  &lt;p&gt;My initial goal is to build a basic codec representation along with some simple transformations.&amp;nbsp; Currently, I am researching bidirectional, reversible and declarative languages as examples.&amp;nbsp; With F# as a base language I believe it will be possible to build something portable to other ML variants. &lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.atalasoft.com/cs/blogs/rickm/archive/2009/04/27/image-processing-as-sets-of-transformations.aspx&amp;amp;;subject=Image+Processing+as+Sets+of+Transformations" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2009/04/27/image-processing-as-sets-of-transformations.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2009/04/27/image-processing-as-sets-of-transformations.aspx&amp;amp;;title=Image+Processing+as+Sets+of+Transformations" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2009/04/27/image-processing-as-sets-of-transformations.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2009/04/27/image-processing-as-sets-of-transformations.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2009/04/27/image-processing-as-sets-of-transformations.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2009/04/27/image-processing-as-sets-of-transformations.aspx&amp;amp;title=Image+Processing+as+Sets+of+Transformations" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2009/04/27/image-processing-as-sets-of-transformations.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2009/04/27/image-processing-as-sets-of-transformations.aspx&amp;amp;;title=Image+Processing+as+Sets+of+Transformations" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2009/04/27/image-processing-as-sets-of-transformations.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.atalasoft.com/cs/blogs/rickm/archive/2009/04/27/image-processing-as-sets-of-transformations.aspx&amp;amp;;title=Image+Processing+as+Sets+of+Transformations&amp;amp;;top=1" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2009/04/27/image-processing-as-sets-of-transformations.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.atalasoft.com/cs/aggbug.aspx?PostID=18366" width="1" height="1"&gt;</description><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/programming/default.aspx">programming</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/F_2300_/default.aspx">F#</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/simplicity/default.aspx">simplicity</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/ideas/default.aspx">ideas</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/.NET/default.aspx">.NET</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/fsharp/default.aspx">fsharp</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/languages/default.aspx">languages</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/haskell/default.aspx">haskell</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/research/default.aspx">research</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/abstract/default.aspx">abstract</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/fp/default.aspx">fp</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/image+processing/default.aspx">image processing</category></item><item><title>How will you parallelize your existing codebase? Try R.A.S.P.</title><link>http://www.atalasoft.com/cs/blogs/rickm/archive/2008/12/23/how-will-you-parallelize-your-existing-codebase-try-r-a-s-p.aspx</link><pubDate>Tue, 23 Dec 2008 21:23:00 GMT</pubDate><guid isPermaLink="false">647108ca-f046-4d8d-9feb-a7fbd2049b37:16964</guid><dc:creator>RickM</dc:creator><slash:comments>6</slash:comments><comments>http://www.atalasoft.com/cs/blogs/rickm/comments/16964.aspx</comments><wfw:commentRss>http://www.atalasoft.com/cs/blogs/rickm/commentrss.aspx?PostID=16964</wfw:commentRss><wfw:comment>http://www.atalasoft.com/cs/blogs/rickm/rsscomments.aspx?PostID=16964</wfw:comment><description>&lt;p&gt;There has been much talk of how we will be writing all of our new code with parallelization in mind.&amp;#160; However, what of our existing code?&amp;#160; It’s unlikely that everyone will just suddenly dump decades of existing code and write everything from scratch.&amp;#160; In this article I’m going to provide a simple methodology for how we might deal with the ever building problem of parallelizing our existing mountains of code.&amp;#160; Comments and contributions are welcome.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Methodologies of the Past&lt;/h3&gt;  &lt;p&gt;From the STL to .NET, the frameworks we have constructed our applications around have been heavily dependent on the idea of an application having a single thread.&amp;#160; Given that the foundation of what we have all been using for a very long time was constructed around this preconception, it’s unreasonable to expect that much of our existing code will ever be fully parallel.&amp;#160; Even those that wrote code on top of a thread safe framework may find that years of patches and and poor design decisions make ground up parallelization impossible.&lt;/p&gt;  &lt;p&gt;If we set our expectations reasonably, we see that we should instead focus on leveraging parallelism to improve the performance of the slowest parts of our software.&amp;#160; From this viewpoint, parallelization is an optimization problem.&amp;#160; Like all optimization, the difficulty of parallelizing code will have much to do with the methodologies which were used to write it.&amp;#160;&amp;#160; &lt;/p&gt;  &lt;p&gt;Of course, object-oriented code being written with modern &lt;a href="http://butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod"&gt;S.O.L.I.D. principles&lt;/a&gt; and will be easier to parallelize than older procedural code.&amp;#160; At the same time, a poorly organized codebase or poorly written code will always make change difficult and so also hard to parallelize.&amp;#160; This is why well written code is worth the investment.&amp;#160; We will see the investment paying off in spades for the companies who have bothered to care about code quality.&amp;#160; Others who find they have spaghetti code under the hood will find they will need to deeply segregate and modularize before parallelization is possible.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;A Methodology for Revisiting the Past&lt;/h3&gt;  &lt;p&gt;In most cases it would be a poor choice to implement your own threading API.&amp;#160; Efficient and easy to use parallelization APIs are coming to (or already part of) every commonly used language and framework.&amp;#160; Most of these APIs are not only built on top of &lt;a href="http://lacl.univ-paris12.fr/gava/PAPP2009/"&gt;years of research&lt;/a&gt;, they also have been written and debugged by a large number of people with specific expertise.&amp;#160; These APIs are a godsend because they will allow most developers to parallelize existing software with a minimum amount of pain.&amp;#160; The parallelization of existing code bases will be much the same as any other kind of performance tuning.&amp;#160; &lt;/p&gt;  &lt;p&gt;The key will be using a profiler to identify places in the code that would be sped up by parallelization and leveraging these new APIs to take advantage of the available hardware.&amp;#160; The exciting part is that this can be done with any existing profiler and many existing APIs.&amp;#160; The unfortunate part is that because memory sharing is such a big issue, parallelization requires a degree of separation beyond other types of optimization and so is likely to require some amount of refactoring.&lt;/p&gt;  &lt;p&gt;Not all types of performance problems are conducive to being solved by parallelization, careful evaluation of the problem at hand is required.&amp;#160; Also, as with anything that requires significant code change, building a solid test fixture is key to introducing as few bugs as possible.&amp;#160; By leveraging the ideas of &lt;a href="http://prematureoptimization.org/blog/archives/26"&gt;avoiding premature optimization&lt;/a&gt;, &lt;a href="http://dotnet.sys-con.com/node/133775"&gt;pragmatic unit testing&lt;/a&gt;, &lt;a href="http://msdn.microsoft.com/en-us/magazine/cc163329.aspx"&gt;using existing APIs&lt;/a&gt;, and &lt;a href="http://www.ryanlowe.ca/blog/archives/001048_be_mindful_of_code_entropy.php"&gt;mindful refactoring&lt;/a&gt; it will be possible to introduce parallelization into many already existing projects with a manageable amount of risk.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;What is RASP?&lt;/h3&gt;  &lt;p&gt;While not included in the acronym, the first step in any kind of optimization is &lt;strong&gt;&lt;a href="http://en.wikipedia.org/wiki/Performance_analysis"&gt;profiling&lt;/a&gt;&lt;/strong&gt;.&amp;#160; Before you can begin to parallelize your code, you must determine where the bottlenecks might be.&amp;#160; A broadly defined list of parallelizable things to look for would be, to quote &lt;a href="http://loufranco.com/blog/files/20-Days-of-Clojure-Day-12.html"&gt;Rich Hickey&lt;/a&gt;, “independent data/work, moderate-to-course-grained work units and/or complex coordination logic that would be simplified with threads”.&amp;#160; A couple quick examples of low hanging fruit to be on the lookout for would be slow iterative loops and blocking I/O.&amp;#160; It is important to note that as a general guideline it would be wrong to parallelize anything if it would not significantly increase the speed of your software.&lt;/p&gt;  &lt;p&gt;For each of the bottlenecks found while profiling, parallelization is best separated into four steps:&lt;/p&gt;  &lt;table cellspacing="0" cellpadding="2"&gt;     &lt;tr&gt;       &lt;td&gt;&lt;strong&gt;Review&lt;/strong&gt;: &lt;/td&gt;        &lt;td&gt;Review code to determine if it is a good candidate for parallelization.&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;&lt;strong&gt;Anchor:&lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;Create a unit test fixture to ensure that the behavior of the to be parallelized code does not change.&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;&lt;strong&gt;Separate&lt;/strong&gt;: &lt;/td&gt;        &lt;td&gt;Ensure that the to be parallelized code has no shared memory constraints.&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td&gt;&lt;strong&gt;Parallelize&lt;/strong&gt;: &lt;/td&gt;        &lt;td&gt;Minimally refactor for parallelization while leveraging an existing API to do the heavy lifting.&lt;/td&gt;     &lt;/tr&gt;   &lt;/table&gt;  &lt;p&gt;As the specifics of what each of these would entail depends greatly on exactly which platform and language is in use, I will not go into them deeply now.&amp;#160; Overall, it’s a simple methodology but I think both sufficient for the task at hand and broadly applicable.&amp;#160; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;h3&gt;Conclusion &lt;/h3&gt;  &lt;p&gt;Review, Anchor, Separate, Parallelize.&amp;#160; It’s not intended to be a difficult concept but instead to provide a simple path to parallelization.&amp;#160; I would be very interested in hearing about any opinions on what RASP might be missing or how it may be better clarified.&amp;#160; While I didn’t have time to discuss them deeply in this post, &lt;a href="http://www.cs.uiuc.edu/homes/snir/PPP/"&gt;parallelization patterns&lt;/a&gt; are also a key concept in using RASP as if you can’t easily identify what can be parallelized than it would be impossible to use any parallelization methodology.&amp;#160; In the future I hope flush out RASP further as well as discuss parallelization patterns in depth.&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.atalasoft.com/cs/blogs/rickm/archive/2008/12/23/how-will-you-parallelize-your-existing-codebase-try-r-a-s-p.aspx&amp;amp;;subject=How+will+you+parallelize+your+existing+codebase%3f+Try+R.A.S.P." target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2008/12/23/how-will-you-parallelize-your-existing-codebase-try-r-a-s-p.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2008/12/23/how-will-you-parallelize-your-existing-codebase-try-r-a-s-p.aspx&amp;amp;;title=How+will+you+parallelize+your+existing+codebase%3f+Try+R.A.S.P." target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2008/12/23/how-will-you-parallelize-your-existing-codebase-try-r-a-s-p.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2008/12/23/how-will-you-parallelize-your-existing-codebase-try-r-a-s-p.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2008/12/23/how-will-you-parallelize-your-existing-codebase-try-r-a-s-p.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2008/12/23/how-will-you-parallelize-your-existing-codebase-try-r-a-s-p.aspx&amp;amp;title=How+will+you+parallelize+your+existing+codebase%3f+Try+R.A.S.P." target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2008/12/23/how-will-you-parallelize-your-existing-codebase-try-r-a-s-p.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2008/12/23/how-will-you-parallelize-your-existing-codebase-try-r-a-s-p.aspx&amp;amp;;title=How+will+you+parallelize+your+existing+codebase%3f+Try+R.A.S.P." target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2008/12/23/how-will-you-parallelize-your-existing-codebase-try-r-a-s-p.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.atalasoft.com/cs/blogs/rickm/archive/2008/12/23/how-will-you-parallelize-your-existing-codebase-try-r-a-s-p.aspx&amp;amp;;title=How+will+you+parallelize+your+existing+codebase%3f+Try+R.A.S.P.&amp;amp;;top=1" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2008/12/23/how-will-you-parallelize-your-existing-codebase-try-r-a-s-p.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.atalasoft.com/cs/aggbug.aspx?PostID=16964" width="1" height="1"&gt;</description><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/programming/default.aspx">programming</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/concurrency/default.aspx">concurrency</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/object+oriented/default.aspx">object oriented</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/ideas/default.aspx">ideas</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/optimization/default.aspx">optimization</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/profiling/default.aspx">profiling</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/procedural/default.aspx">procedural</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/RASP/default.aspx">RASP</category></item><item><title>Avoiding the Dangers of Ambiguously Defined Data-Types</title><link>http://www.atalasoft.com/cs/blogs/rickm/archive/2008/10/03/avoiding-ambiguous-types-in-c.aspx</link><pubDate>Fri, 03 Oct 2008 15:10:00 GMT</pubDate><guid isPermaLink="false">647108ca-f046-4d8d-9feb-a7fbd2049b37:15911</guid><dc:creator>RickM</dc:creator><slash:comments>11</slash:comments><comments>http://www.atalasoft.com/cs/blogs/rickm/comments/15911.aspx</comments><wfw:commentRss>http://www.atalasoft.com/cs/blogs/rickm/commentrss.aspx?PostID=15911</wfw:commentRss><wfw:comment>http://www.atalasoft.com/cs/blogs/rickm/rsscomments.aspx?PostID=15911</wfw:comment><description>&lt;p&gt;When you are handed a string, integer, or any value type, can you know what it really represents?&amp;nbsp; Can you define the range of appropriate behaviors for that data?&amp;nbsp; Can you tell if it's formatted correctly?&amp;nbsp;&amp;nbsp; The problem is, in all of these cases, you can't.&amp;nbsp; You can't be sure of it's meaning, it's format or even how to treat it.&amp;nbsp; This is why ambiguous types break the &lt;a href="http://en.wikipedia.org/wiki/Object-oriented_programming"&gt;object-oriented programming paradigm&lt;/a&gt; and should be avoided whenever possible.&lt;br&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Forward&lt;/b&gt;&lt;b&gt;&lt;br&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;It's laughable to think that a Physical Engineer or Physicist would work without the aid of units. This is because, when you have undefined units, you can't verify that the thing you get at the end of a computation is defined in a consistent way. &amp;nbsp; &lt;/p&gt;&lt;p&gt;In computing, the counterpart to the Physical Engineer is the Software Engineer.&amp;nbsp; Why is the Software Engineer not held to the same type of design integrity?&amp;nbsp; The use of ambiguously defined variables is one of the largest sources of bugs in modern software development and yet we ignore it.&amp;nbsp; In fact, with many dynamically typed languages we are moving in the direction of more and more ambiguity.&lt;br&gt;&lt;/p&gt;&lt;p&gt;In C# and Java, strings and value types are defined only in terms of their lexical and
mathematical operations.&amp;nbsp; Except from the context in which they are used, they carry no additional information about the meaning of their
content.&amp;nbsp; In order to perform any non-trivial operation on that data, you have to make assumptions about it's meaning, which in turn leads to bugs.&amp;nbsp; &lt;br&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Is what you are writing really object oriented?&lt;/b&gt;&lt;/p&gt;&lt;p&gt;This may seem like a silly question to ask in the modern programming era.&amp;nbsp; Almost everyone is using an object oriented language these days and its mostly taken for granted.&amp;nbsp; However, as any beginning programmer knows, it is very
easy to program in an object oriented programming language while
completely ignoring the underlying paradigm.&lt;/p&gt;&lt;p&gt;We don't use OO because it's an agreed standard for implementing a programming language, we use it to solve a specific set of problems.&amp;nbsp; These problems are directly related to the modeling of data and data manipulation.&amp;nbsp; Groups of data subtypes are classified into a larger object and operations on that data are defined in such a way as to model behavior in terms of that classification.&amp;nbsp; If the paradigm is ignored these issues become manifest as ambiguity and disorganization.&amp;nbsp; &lt;/p&gt;&lt;p&gt;It follow that using ambiguous data-types in a public API goes directly against not only the object oriented paradigm but also the broader goal of data classification and program integrity.&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Why not pass strings and value types as arguments to public methods?&lt;br&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Using an ambiguously defined data type instead of a well defined object
means that the domain and formatting of that data is left open to
question.&amp;nbsp; It also means that if a user of that data formats it
inappropriately it may find it's way into an operation for another type of data and cause havoc. &lt;br&gt;&lt;/p&gt;&lt;p&gt;For a programmer that is familiar with object oriented programming it often comes down to a choice of encapsulation versus convenience.&amp;nbsp; I know as well as anyone that having to define an object to carry your data when you could just pass in a string and a couple of integers can feel tedious.&amp;nbsp; However, by taking the easy way out, you are setting things up to fail down the road.&lt;br&gt;&lt;/p&gt;&lt;p&gt;Consider, is it possible that sometime in the future someone will be using the API you are defining?&amp;nbsp; Will the person looking at that code know the specific format you chose for that string?&amp;nbsp; What about the range of valid values for those integers?&amp;nbsp; What kinds of assumptions about that data will be made that you may have not considered?&amp;nbsp; If they mess up that format or get the range wrong, at what point will it become obvious?&amp;nbsp; &lt;br&gt;&lt;/p&gt;&lt;p&gt;There are a lot of advantages to using objects instead:&amp;nbsp; An object which was designed to carry that same data could verify that it is well defined when it is constructed.&amp;nbsp; It can hand back that data formatted or manipulated in many different ways.&amp;nbsp; You can well defined questions which can be asked about that data which makes program control flow more obvious.&amp;nbsp; Best of all, the code for all of these things is centralized and up to the discretion of the designer of said object.&amp;nbsp; Using a well defined object, two people with different assumptions about that data but asking the same question will get the same result.&amp;nbsp; &lt;/p&gt;&lt;p&gt;Of course, at the lowest level a CPU will be operating on basic value
types and so our code will always reflect that to some degree.&amp;nbsp;
However, because ambiguous types are extremely dangerous, they should
almost always be encapsulated and well defined.&amp;nbsp; &lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;What tools are available to me in .NET?&lt;br&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;If you are a .NET programmer the best thing you can do right now is to become familiar with the already existing classes available for making your strings more well defined such as &lt;a href="http://msdn.microsoft.com/en-us/library/system.uri%28VS.80%29.aspx"&gt;System.Uri&lt;/a&gt; and &lt;a href="http://msdn.microsoft.com/en-us/library/system.io.fileinfo%28VS.80%29.aspx"&gt;System.IO.FileInfo&lt;/a&gt;.&amp;nbsp; I've put up a &lt;a href="http://stackoverflow.com/questions/168732/what-are-some-string-encapsulation-classes-which-specify-both-meaning-and-behav"&gt;question on stackoverflow&lt;/a&gt; in order to try to build up a list of available container classes.&lt;br&gt;&lt;/p&gt;&lt;p&gt;Beyond the use of predefined classes, it's best to make your own encapsulation objects with heavy up front validation.&amp;nbsp; You can then use extension methods to make native .NET classes take your new validated type.&amp;nbsp; It would be worth putting together a library of free encapsulation classes, structs and extension methods to allow for easy interoperability.&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Beware, the .NET Framework encourages ambiguous types.&lt;/b&gt;&lt;/p&gt;&lt;p&gt;Unfortunately, as well designed as it is for many things, the .NET Framework is pretty bad about ambiguity.&amp;nbsp; Based on classes such as System.IO.Path and System.IO.FileStream which for some reason take paths represented as strings,&amp;nbsp; you might even say that ambiguity is encouraged.&amp;nbsp; Consider the vast number of methods in .NET classes which take unencapsulated strings and scalar types. &lt;br&gt;&lt;/p&gt;&lt;p&gt;The most unfortunate side effect of this design is that users of the .NET API may come to believe that this is the way things should be in a proper object oriented API.&amp;nbsp; Also, as a consequence, if you want your own product's API to be easily understood by a .NET user you have to follow the same destructive conventions.&lt;br&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;F# helps to solve this problem with Units of Measure.&lt;br&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;In most object oriented languages, if you were to encapsulate every single scalar value that was passed into a method, it would be quite a lot of extra coding.&amp;nbsp; Microsoft's newest programming language, F#, has a feature called &lt;a href="http://blogs.msdn.com/andrewkennedy/archive/2008/08/20/units-of-measure-in-f-part-one-introducing-units.aspx"&gt;Units of Measure&lt;/a&gt; which allows a programmer to optionally specify both meaning and behavior for classes of scalar types.&amp;nbsp; &lt;/p&gt;&lt;p&gt;A scalar with a unit of measure is a real type which is enforced by the compiler.&amp;nbsp; When an operation is performed the resulting type is that of the combined units used for the calculation, just as they would be in physics or engineering.&amp;nbsp; This is because F# is designed in part to be used by engineers and scientists.&amp;nbsp; As a side effect we as programmers get to reap the same benefit.&lt;br&gt;&lt;/p&gt;&lt;p&gt;This type of scalar type classification has long been missing from object oriented languages.&amp;nbsp; It's a huge step forward and I hope other programming languages move to adopt it quickly.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;b&gt;Addendum&lt;/b&gt;&lt;/p&gt;&lt;p&gt;@Mark and Jon:&lt;/p&gt;
&lt;p&gt;I think I may not have fully expressed what I meant by "handed a
string or integer". The context am talking about is post-compilation
when variable names no longer have real meaning. In this context
(discounting reflection on variable name) all you can tell about an
integer is where it is coming from and it's value. An executing program
does not have access to documentation.&lt;/p&gt;
&lt;p&gt;It's also important to consider reflective programming. It is generally agreed that reflective
programming is where the object oriented world is headed. However, when
you have a scalar value, you can tell very little about it through
reflection. While it is possible to retrieve the variable's name using reflection, actually
using the name of said variable to carry type information is a methodology which is extremely
prone to errors from mistyping. Errors which will not be caught at
compile time and which may lead your program to incorrect paths of
execution.&lt;/p&gt;&lt;p&gt;Also, I want to note that while a string is not a scalar value it does suffer from the same type of ambiguity. For this reason it, and other "base" types, should be handled similarly.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.atalasoft.com/cs/blogs/rickm/archive/2008/10/03/avoiding-ambiguous-types-in-c.aspx&amp;amp;;subject=Avoiding+the+Dangers+of+Ambiguously+Defined+Data-Types" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2008/10/03/avoiding-ambiguous-types-in-c.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2008/10/03/avoiding-ambiguous-types-in-c.aspx&amp;amp;;title=Avoiding+the+Dangers+of+Ambiguously+Defined+Data-Types" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2008/10/03/avoiding-ambiguous-types-in-c.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2008/10/03/avoiding-ambiguous-types-in-c.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2008/10/03/avoiding-ambiguous-types-in-c.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2008/10/03/avoiding-ambiguous-types-in-c.aspx&amp;amp;title=Avoiding+the+Dangers+of+Ambiguously+Defined+Data-Types" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2008/10/03/avoiding-ambiguous-types-in-c.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2008/10/03/avoiding-ambiguous-types-in-c.aspx&amp;amp;;title=Avoiding+the+Dangers+of+Ambiguously+Defined+Data-Types" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2008/10/03/avoiding-ambiguous-types-in-c.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.atalasoft.com/cs/blogs/rickm/archive/2008/10/03/avoiding-ambiguous-types-in-c.aspx&amp;amp;;title=Avoiding+the+Dangers+of+Ambiguously+Defined+Data-Types&amp;amp;;top=1" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2008/10/03/avoiding-ambiguous-types-in-c.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.atalasoft.com/cs/aggbug.aspx?PostID=15911" width="1" height="1"&gt;</description><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/programming/default.aspx">programming</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/meta/default.aspx">meta</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/F_2300_/default.aspx">F#</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/object+oriented/default.aspx">object oriented</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/code/default.aspx">code</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/ideas/default.aspx">ideas</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/.NET/default.aspx">.NET</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/C_2B002B00_/default.aspx">C++</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/fsharp/default.aspx">fsharp</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/javascript/default.aspx">javascript</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/technology/default.aspx">technology</category></item><item><title>IPCV 08' Part 2 - Novel Approaches  </title><link>http://www.atalasoft.com/cs/blogs/rickm/archive/2008/07/17/ipcv-08-part-2-novel-approaches.aspx</link><pubDate>Thu, 17 Jul 2008 17:15:00 GMT</pubDate><guid isPermaLink="false">647108ca-f046-4d8d-9feb-a7fbd2049b37:14962</guid><dc:creator>RickM</dc:creator><slash:comments>1</slash:comments><comments>http://www.atalasoft.com/cs/blogs/rickm/comments/14962.aspx</comments><wfw:commentRss>http://www.atalasoft.com/cs/blogs/rickm/commentrss.aspx?PostID=14962</wfw:commentRss><wfw:comment>http://www.atalasoft.com/cs/blogs/rickm/rsscomments.aspx?PostID=14962</wfw:comment><description>I've managed to rig up Steve's cell to my laptop and I once again have Internet Access. From the time of my last post, most of the talks have been about applications of machine learning. This usually involves a neural network, PCA (Principle Component...(&lt;a href="http://www.atalasoft.com/cs/blogs/rickm/archive/2008/07/17/ipcv-08-part-2-novel-approaches.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://www.atalasoft.com/cs/aggbug.aspx?PostID=14962" width="1" height="1"&gt;</description><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/tradeshow/default.aspx">tradeshow</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/experiences/default.aspx">experiences</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/ideas/default.aspx">ideas</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/ipcv/default.aspx">ipcv</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/worldcomp/default.aspx">worldcomp</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/conference/default.aspx">conference</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/mpeg/default.aspx">mpeg</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/Tchebichef/default.aspx">Tchebichef</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/MST/default.aspx">MST</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/curves/default.aspx">curves</category></item><item><title>IPCV 08' - Day One Through One Point Five Rundown</title><link>http://www.atalasoft.com/cs/blogs/rickm/archive/2008/07/15/ipcv-08-day-one-through-one-point-five-rundown.aspx</link><pubDate>Tue, 15 Jul 2008 18:03:00 GMT</pubDate><guid isPermaLink="false">647108ca-f046-4d8d-9feb-a7fbd2049b37:14941</guid><dc:creator>RickM</dc:creator><slash:comments>0</slash:comments><comments>http://www.atalasoft.com/cs/blogs/rickm/comments/14941.aspx</comments><wfw:commentRss>http://www.atalasoft.com/cs/blogs/rickm/commentrss.aspx?PostID=14941</wfw:commentRss><wfw:comment>http://www.atalasoft.com/cs/blogs/rickm/rsscomments.aspx?PostID=14941</wfw:comment><description>As you might have seen in Steve's Blog , we ended up getting stranded in Milwaukee overnight and missed most of the keynotes. We did manage to catch the last one which was on a company called Element CXI's very interesting reconfigurable hardware model....(&lt;a href="http://www.atalasoft.com/cs/blogs/rickm/archive/2008/07/15/ipcv-08-day-one-through-one-point-five-rundown.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://www.atalasoft.com/cs/aggbug.aspx?PostID=14941" width="1" height="1"&gt;</description><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/tradeshow/default.aspx">tradeshow</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/experiences/default.aspx">experiences</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/ideas/default.aspx">ideas</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/ipcv/default.aspx">ipcv</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/worldcomp/default.aspx">worldcomp</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/conference/default.aspx">conference</category></item><item><title>Comments About Flat Files</title><link>http://www.atalasoft.com/cs/blogs/rickm/archive/2008/06/09/comments-about-flat-files.aspx</link><pubDate>Mon, 09 Jun 2008 15:38:00 GMT</pubDate><guid isPermaLink="false">647108ca-f046-4d8d-9feb-a7fbd2049b37:14289</guid><dc:creator>RickM</dc:creator><slash:comments>6</slash:comments><comments>http://www.atalasoft.com/cs/blogs/rickm/comments/14289.aspx</comments><wfw:commentRss>http://www.atalasoft.com/cs/blogs/rickm/commentrss.aspx?PostID=14289</wfw:commentRss><wfw:comment>http://www.atalasoft.com/cs/blogs/rickm/rsscomments.aspx?PostID=14289</wfw:comment><description>Comments About Flat Files My last blog post got a lot of reddit attention this weekend. I want to thank all of the posters with constructive comments. Open discussion like this is what makes the Internet great. I would also like to take a moment to discuss...(&lt;a href="http://www.atalasoft.com/cs/blogs/rickm/archive/2008/06/09/comments-about-flat-files.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://www.atalasoft.com/cs/aggbug.aspx?PostID=14289" width="1" height="1"&gt;</description><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/programming/default.aspx">programming</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/meta/default.aspx">meta</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/ideas/default.aspx">ideas</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/reddit/default.aspx">reddit</category></item><item><title>Why Are Our Programs Still Represented by Flat Files?</title><link>http://www.atalasoft.com/cs/blogs/rickm/archive/2008/06/06/why-are-our-programs-still-represented-by-flat-files.aspx</link><pubDate>Fri, 06 Jun 2008 19:45:00 GMT</pubDate><guid isPermaLink="false">647108ca-f046-4d8d-9feb-a7fbd2049b37:14264</guid><dc:creator>RickM</dc:creator><slash:comments>33</slash:comments><comments>http://www.atalasoft.com/cs/blogs/rickm/comments/14264.aspx</comments><wfw:commentRss>http://www.atalasoft.com/cs/blogs/rickm/commentrss.aspx?PostID=14264</wfw:commentRss><wfw:comment>http://www.atalasoft.com/cs/blogs/rickm/rsscomments.aspx?PostID=14264</wfw:comment><description>It's time to leave the secondary, external structure of our programs behind. If you can treat the reflected code from a programming language like an abstract data structure, why can’t you just keep the source itself in a similarly abstracted data structure?...(&lt;a href="http://www.atalasoft.com/cs/blogs/rickm/archive/2008/06/06/why-are-our-programs-still-represented-by-flat-files.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://www.atalasoft.com/cs/aggbug.aspx?PostID=14264" width="1" height="1"&gt;</description><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/clojure/default.aspx">clojure</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/IS/default.aspx">IS</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/meta/default.aspx">meta</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/F_2300_/default.aspx">F#</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/functional/default.aspx">functional</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/C_2300_/default.aspx">C#</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/concurrency/default.aspx">concurrency</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/code/default.aspx">code</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/ideas/default.aspx">ideas</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/.NET/default.aspx">.NET</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/fsharp/default.aspx">fsharp</category></item><item><title>Top 5 Features Your Cellphone Should Already Have</title><link>http://www.atalasoft.com/cs/blogs/rickm/archive/2008/02/20/top-5-features-your-cellphone-should-have.aspx</link><pubDate>Wed, 20 Feb 2008 18:33:00 GMT</pubDate><guid isPermaLink="false">647108ca-f046-4d8d-9feb-a7fbd2049b37:13279</guid><dc:creator>RickM</dc:creator><slash:comments>0</slash:comments><comments>http://www.atalasoft.com/cs/blogs/rickm/comments/13279.aspx</comments><wfw:commentRss>http://www.atalasoft.com/cs/blogs/rickm/commentrss.aspx?PostID=13279</wfw:commentRss><wfw:comment>http://www.atalasoft.com/cs/blogs/rickm/rsscomments.aspx?PostID=13279</wfw:comment><description>&lt;p&gt;Why is innovation dead in the cell phone industry? &lt;br&gt;This is a list of five innovations I would like to see cell phone manufacturers and service providers bring to market. &lt;/p&gt;
&lt;p&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/p&gt;
&lt;p&gt;1) &lt;b&gt;Timed Silent Mode&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;How many times has this happened to you: &lt;br&gt;You go into a movie and like any polite movie goer you put your phone on silent. Then you completely forget about it. A few days later you start wondering why none of your friends have called and start feeling like a social outcast but wait... your cell phone has been on silent the whole time. This is such a simple feature I can not think of any excuse for it not to be on all cell phones.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;2) &lt;b&gt;Server-Side Text Message Storage&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Shouldn't the 10 cents per message get you something? I mean really, I feel like a little part of me dies every time I pay the cell phone company for the privilege of sending a miniscule bit of text over their network. Also, it's such a tiny bit of data; do we really need to lose it all every time we get a new phone? Also, I know two separate people who have run out of text message space on their phones. This is just ridiculous. Can't they at least use some kind of compressed format? Just keeping the messages stored for you would completely solve this issue. I would even be willing to navigate some kind of web interface to get at them.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;3) &lt;b&gt;Accessible cell network APIs.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;Are cell phone networks really so exploitable that we should not have access to the guts of our phones? Imagine the kind of awesome innovation could happen by GPLing your phone software and letting programmers have at it. Even a phone with very basic functionality would be wildly popular if people could write their own core applications or operating systems. The free R&amp;amp;D benefit would also be phenomenal. You might see anything from more efficient algorithms for cell tower switching and power management to innovative new interfaces. I wonder if it would be possible to write something that could use tower triangulation to determine your location without having a GPS receiver. The possibilities are limitless.&lt;/p&gt;
&lt;p&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/p&gt;
&lt;p&gt;4) &lt;b&gt;Social Network Integration&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;How cool would it be if you could just download all of your friend’s phone numbers off of Facebook, MySpace or LinkedIn and just have them show up in your phone? I can see some people saying this would cause phone number overload but that is only because cell phones have such abysmal contact categorization. What if they were placed in easy to navigate categories based on where they came from? Now you might ask, what about privacy? Well, the networks themselves could implement controls to limit who gets your contact information. Imagine being able to have your cell phone automatically have all your business contacts. Now imagine you were the social network site that people had to be a part of to be in everyone’s cell phone business contacts automatically. You could even add a search feature to find people in a certain industry or area quickly. Effectively managing your contacts would suddenly become extremely simple. It’s a huge win for everyone involved. &lt;/p&gt;
&lt;p&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/p&gt;
&lt;p&gt;5) &lt;b&gt;Inter-network Real Time Chat&lt;o:p&gt;&lt;/o:p&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;While text messaging is a good start it has a lot of big problems. We get charged an obscene amount of money to transfer a tiny bit of information. There is no guarantee that the message will actually get to the destination and there is no way to tell. There is a long delay between when the message is sent and when it is received on the other end. Living in the modern day internet age these limitations seem absolutely ridiculous. If the cell networks can support real time audio streams (phone conversations) why can’t they support real time text? The reality of the situation is that the phone companies would rather nickel and dime us with text messages than give us a decent service. Ideally, phone chat would sport these features:&lt;/p&gt;
&lt;p&gt;-Fast enough to carry on a conversation without huge misunderstandings developing due to badly timed messages. &lt;br&gt;-User Status to tell people if you want to be bothered or not.&lt;br&gt;-Message storage so we can catch up when were in a no service area or our phone dies.&lt;br&gt;-Supported by the majority of new phones by the majority of carriers.&lt;br&gt;-Group Chat (Chat Rooms)&lt;br&gt;-Inline picture uploading would be a nice touch.&lt;br&gt;-Some internetwork communication would be nice too (MSN, AIM.. etc).&lt;/p&gt;
&lt;p&gt;T-Mobile comes close to this ideal with their AIM friendly phones but, unfortunately, there are some major issues with their service. I had a T-Mobile sidekick for a few months and it suffered from two major problems: T-Mobile has mind blowingly awful coverage areas. And not everyone has a sidekick and/or AIM.&lt;/p&gt;
&lt;p&gt;This may seem like a lot to ask for. However, I think the majority of people would pay five or even ten bucks a month to be able to chat with their friends at any time. The network load incurred by sending a small amount of text would be insignificant.&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p class="MsoNormal"&gt;&lt;span&gt;&lt;o:p&gt;What features do you think cell phones are missing?&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;
&lt;div class = "shareblock"&gt;&lt;strong&gt;Share this post:&lt;/strong&gt; &lt;a href = "mailto:?body=Thought you might like this: http://www.atalasoft.com/cs/blogs/rickm/archive/2008/02/20/top-5-features-your-cellphone-should-have.aspx&amp;amp;;subject=Top+5+Features+Your+Cellphone+Should+Already+Have" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2008/02/20/top-5-features-your-cellphone-should-have.aspx"&gt;email it!&lt;/a&gt; |  &lt;a href = "http://del.icio.us/post?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2008/02/20/top-5-features-your-cellphone-should-have.aspx&amp;amp;;title=Top+5+Features+Your+Cellphone+Should+Already+Have" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2008/02/20/top-5-features-your-cellphone-should-have.aspx"&gt;bookmark it!&lt;/a&gt; |  &lt;a href = "http://www.digg.com/submit?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2008/02/20/top-5-features-your-cellphone-should-have.aspx&amp;amp;;phase=2" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2008/02/20/top-5-features-your-cellphone-should-have.aspx"&gt;digg it!&lt;/a&gt; |  &lt;a href = "http://reddit.com/submit?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2008/02/20/top-5-features-your-cellphone-should-have.aspx&amp;amp;title=Top+5+Features+Your+Cellphone+Should+Already+Have" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2008/02/20/top-5-features-your-cellphone-should-have.aspx"&gt;reddit!&lt;/a&gt; |  &lt;a href = "http://www.dotnetkicks.com/submit/?url=http://www.atalasoft.com/cs/blogs/rickm/archive/2008/02/20/top-5-features-your-cellphone-should-have.aspx&amp;amp;;title=Top+5+Features+Your+Cellphone+Should+Already+Have" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2008/02/20/top-5-features-your-cellphone-should-have.aspx"&gt;kick it!&lt;/a&gt; |  &lt;a href = "https://favorites.live.com/quickadd.aspx?marklet=1&amp;amp;;mkt=en-us&amp;amp;;url=http://www.atalasoft.com/cs/blogs/rickm/archive/2008/02/20/top-5-features-your-cellphone-should-have.aspx&amp;amp;;title=Top+5+Features+Your+Cellphone+Should+Already+Have&amp;amp;;top=1" target="_blank" title = "Post http://www.atalasoft.com/cs/blogs/rickm/archive/2008/02/20/top-5-features-your-cellphone-should-have.aspx"&gt;live it!&lt;/a&gt;&lt;/div&gt;&lt;img src="http://www.atalasoft.com/cs/aggbug.aspx?PostID=13279" width="1" height="1"&gt;</description><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/ideas/default.aspx">ideas</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/cellphones/default.aspx">cellphones</category><category domain="http://www.atalasoft.com/cs/blogs/rickm/archive/tags/lists/default.aspx">lists</category></item></channel></rss>