INFO-LINK




Development Tools

Dependency Injection & Testable Objects


Jeremy is a senior software engineer for Kronos. He can be contacted at jeremy@weiskotten.com.


You can easily create reusable objects through encapsulation. However, even the most cohesive, well-encapsulated objects can be tightly coupled with other well-encapsulated objects. Tight coupling results in a tangled web of dependencies composed of objects that are fragile, difficult to reuse, and difficult to unit test. Applications with loosely coupled components, on the other hand, are modular, flexible, and easily tested with unit tests. Dependency injection, the topic I examine in this article, is a simple pattern to loosely couple objects and their dependencies.

It's easy to understand objects that have no dependencies on other objects. You can look at the code, see how its public methods work, fix bugs, and enhance its behavior. But what if another object uses the one you've just changed? Did you know about it and did your change break it? Are you prepared to make changes to that consumer, then make changes to its consumers? It doesn't take long before the problem snowballs. Tightly coupled objects cannot be changed easily without consequences. When there is no explicit contract that defines the relationship between objects, it's often difficult to predict what effect a change in one object will have on its consumers.

Coupling is transitive. If A is coupled to B and B is coupled to C, then A is effectively coupled to C. Objects with tightly coupled dependencies cannot be reused without lugging around the baggage of those dependencies. Dependencies can be expensive, often performing time-consuming procedures such as getting data from a database, and they may have expensive dependencies of their own. Objects that have heavy, expensive dependencies can't easily be reused in lightweight environments like unit tests.

Unit tests are "white box" tests that exercise objects (given intimate knowledge of their design). Unit testing exercises an object in isolation and is not designed to measure how an object interacts with its dependencies. You are much more likely to run unit tests continuously if they run quickly. Unit tests should run in seconds, not minutes, which allows for short feedback cycles when writing new code or refactoring to improve the design.

A unit test is a user of the object it tests. An object must exist for a reason, so there must be other objects that also use it. Even when only one application object uses it, the fact that the unit test is also a user means it has at least two users, and therefore the object must be reusable by design. Test-driven development (TDD), in which unit tests are written before the objects they test, is gaining as a development best practice. One beneficial consequence of TDD is that objects are designed with testability in mind, and therefore, an object and its dependencies must be loosely coupled and reusable. Dependency injection is a popular pattern to design loosely coupled—and therefore robust, reusable, and testable—objects.

Interfaces as Contracts

Modern object-oriented languages such as Java and C# provide a way to define interfaces. An interface defines the explicit contract between an object that implements the interface (a service) and an object that depends on it (a consumer). In this article, I use Java and JUnit, along with common Java terms (like "extend" and "implement"). The C++ equivalent of a Java interface is a class that contains only public, pure virtual methods, and a C++ class that implements an interface actually inherits from such a class.

An interface defines the methods that must be exposed by a service for use by its consumers. There may be any number of different implementations of an interface, each of which provides the same service (through public methods), but may be designed and implemented differently—for example, a "stub" implementation holds the fort until real implementations are designed, developed, or provided, while a "mock" implementation simulates the behavior of a production implementation for lightweight unit-testing purposes.

Both stubs and mocks simulate the behavior of production implementations to test components as early as possible without their dependencies, and the mechanics are often identical. The difference between them is subtle, but important. Think of it this way: Stubs are temporary placeholders and don't add significant value to your project (other than letting you defer design decisions), while mocks add permanent value when applied to unit tests.

Coding to well-defined interfaces, particularly when using the dependency injection pattern, is the key to achieving loose coupling. By coupling an object to an interface instead of a specific implementation, you have the ability to use any implementation with minimal change and risk.

An Example

The Carpenter interface in Example 1 defines the contract for a carpenter. The interface contains one method, getShelter, which returns a Shelter. The interface doesn't expose or describe how Carpenter works, only that Carpenter agrees to provide a particular service. It's up to the implementation to determine whether to use hand tools or power tools, whether to do the job alone or hire a crew of 50, whether to create a new shelter from scratch or to purchase a fixer-upper, or whether to build a palace or a shack.

public interface Carpenter {
    Shelter getShelter();
}

Example 1: Carpenter interface.

Example 2 is an implementation of the Carpenter interface, TentCarpenter, which creates and returns a new Tent instance from getShelter (assuming that Tent is a concrete class that implements the Shelter interface).

public class TentCarpenter implements Carpenter {
   public Shelter getShelter() {
       return new Tent(); // class Tent implements Shelter
    }
}

Example 2: TentCarpenter implementation.

A person relocating to a new home is encapsulated by the class Relocater (Example 3). A Relocater depends on a Carpenter to provide a shelter to move into. In this example, the Relocater and Carpenter are already coupled fairly loosely because the object is accessed only through methods defined by the interface. The only time the actual implementation is specified is when the Relocater is constructed and a TentCarpenter is created.

public class Relocater {
    private final Carpenter carpenter;
    public Relocater() {
        carpenter = new TentCarpenter();
    }
    public Shelter moveIntoNewDigs() {
        Shelter digs = carpenter.getShelter();
        return digs;
    }
}

Example 3: Loosely coupled by coding to an interface.

The Relocater class is immutable—once constructed, its state never changes because the field carpenter is declared final and initialized in the constructor. It's a good practice to use immutable objects whenever possible, because they're inherently thread safe.

Refactoring for Testability

Every instance of Relocater uses the TentCarpenter implementation, so there is no convenient way to unit test Relocater in isolation with the current design. Relocater's getShelter method always gets a Tent from a TentCarpenter, but you want to test Relocater, not TentCarpenter or Tent. (Of course, you've probably already written unit tests that exercise TentCarpenter and Tent, and you could want to write an integration test that exercises the relationship between Relocater and TentCarpenter, but there's not much point in doing that until you know for sure that Relocater works in isolation.) If Relocater and its Carpenter dependency were more loosely coupled, you could use a lightweight mock implementation of Carpenter for unit testing.

There are a few ways to refactor this class to make it more flexible and amenable to testing:

  • Extend and Construct Mock. A unit test extends Relocater and provides a new constructor that creates a mock Carpenter. However, the field "carpenter" is declared private, so you need to add a protected method named setCarpenter to Relocater to let you set the carpenter from a subclass. The field carpenter was originally declared final to make it immutable. This new strategy breaks the immutability, so the final keyword must be removed. This is pretty major surgery (with some nasty side effects like losing immutability) just to make the object unit testable!
  • Extend and Override Getter. Add a method named getCarpenter to Relocater that returns the field carpenter, and change any code that directly accesses the field to call the new method. A unit test extends Relocater and overrides getCarpenter, making it return a mock Carpenter. The carpenter field can be lazily initialized in getCarpenter. This strategy isn't too horrible—it preserves the object's immutability, but you still need to subclass Relocater for unit testing.
  • Dependency Injection. Add a constructor to Relocater with a Carpenter parameter. The constructor sets the carpenter field to the instance passed into the constructor. This constructor provides a way for the unit test to provide (inject) its mock implementation.

Example 4 shows the constructor that has been refactored for dependency injection.

public Relocater(Carpenter carpenter) {
        this.carpenter = carpenter;
}

Example 4: Refactored to dependency injection.

The "Extend" options get the job done, but at a cost. At a minimum, the cost is complexity that obscures the original design, making the code harder to understand and maintain in the future. In addition, the unit tests are more complex and therefore harder to write and understand.

Using dependency injection, the object is much more flexible without adding a significant amount of complexity or sacrificing any design principles (such as immutability). It's also easy to test, with no need to write a subclass (see Example 5).

public class RelocaterTest extends TestCase {
    public void testMoveIntoNewDigs() {
        Relocater relocater = 
            new Relocater(new MockCarpenter());
        Shelter shelter = relocater.moveIntoNewDigs();
        assertNotNull(shelter);
    }
}

Example 5: Unit testing with a mock.

An object's consumer—whoever has a dependency on the object—should rarely be required to explicitly inject dependencies. Not only would this result in more (and more complicated) code on the consumer's end, it violates the principle of encapsulation (by exposing an implementation detail) and can result in tightly coupled code. In most cases, a component should be ignorant of its dependencies' dependencies. Therefore, you should consider a few additional design options when refactoring to dependency injection:

  • Default Constructor Delegation. The default constructor might delegate to the dependency-injecting constructor, passing in an instance of the default Carpenter implementation. Any other construction details would only need to be added to one constructor.
  • Protected Constructor. Use default constructor delegation, but make the dependency-injecting constructor protected, so that it can still be called from a unit test that lives in the same package (but in a different directory) as the class. This prevents outsiders from invoking the constructor with an unknown Carpenter implementation. You might do this if you are only using dependency injection for testability, not modularity.
  • Factory Method. Remove (or make private or protected) the default constructor, make the dependency-injecting constructor protected (so that it can still be called from a unit test), and add a static factory method that injects an instance of the default Carpenter implementation. Any consumers that currently instantiate the class using the new operator must be changed to call the factory method.

This strategy also makes it easy to use a lightweight dependency injection container in the future. If you decide to use a container like Spring, just gut the factory method and add the code to create the object using the Spring API.

Example 6 shows a factory method that uses dependency injection to assemble a Relocater and its Carpenter.

public static Relocater getInstance() {
    Carpenter carpenter = new TentCarpenter();
    return new Relocater(carpenter);
}

Example 6: Injecting the dependency in a factory.

Even after you refactor to use a factory method, the JUnit test from Example 5 should still pass.

Dependency Injection Containers

An object and its dependencies can be constructed and assembled using a lightweight dependency-injection container such as Spring (http://www.springframework.org/), PicoContainer (http://www.picocontainer.org/), and HiveMind (http://jakarta.apache.org/hivemind/). These open-source containers take care of the construction, injection, and lifecycle-management details for your objects and their dependencies.

Spring and HiveMind also let you define the relationships between objects in external XML configuration files, which results in modular systems. The containers construct and inject the appropriate dependencies at runtime. If you want or need to swap one implementation of a dependency for another, you simply modify the configuration and restart the application—no recompiling or redeploying!

Example 7 is a Spring configuration file, beans.xml, that associates Relocater to an implementation of its Carpenter dependency. In Example 8, the factory method has been changed to use the Spring BeanFactory API to create the bean.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC 
    "-//SPRING//DTD BEAN//EN" 
    "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
    <bean id="relocater" class=
            "com.ddj.dependencyinjection.Relocater">
        <constructor-arg><ref bean=
            "carpenter"/></constructor-arg>
    </bean>
    <bean id="carpenter" class="com.ddj.dependencyinjection.TentCarpenter"/>
</beans>

Example 7: Spring beans.xml configuration file.

public static Relocater create() {
    ClassPathResource res = 
        new ClassPathResource("beans.xml");
    XmlBeanFactory factory = new XmlBeanFactory(res);
    return (Relocater)factory.getBean("relocater");
}

Example 8: Factory method that uses the Spring API to create the object.

Setter Injection

The examples so far have demonstrated constructor injection, where dependencies are injected through the object's constructor. Another common dependency injection pattern is setter injection.

You might prefer, at least in certain circumstances, setter injection, where dependencies are injected through setter methods, or mutators, into an object that has already been constructed. Example 9 demonstrates setter injection from a factory method.

public static Relocater getInstance() {
    Relocater relocater = new Relocater();
    relocater.setCarpenter(new TentCarpenter());
    return relocater;
}

Example 9: Factory method that uses setter injection.

Setter injection has some benefits over constructor injection:

  • An object's dependencies can be changed at runtime.
  • Constructors with lots of parameters, especially when some parameters are of the same type, can be difficult to understand and use properly. Setter methods are a more self-descriptive option.
  • Constructors are not inheritable in Java but setters are. A component extending a class that uses constructor injection must explicitly declare each constructor and forward to the superclass's implementation. Setter methods, on the other hand, are inherited.

The primary detriment is that an object with setters cannot be immutable, and immutability has many benefits. (You might design semimutable objects that have mutable attributes but immutable dependencies.) Because I prefer to write immutable objects whenever possible, I prefer constructor injection, but it's a design decision that may differ from one object to the next. Some developers prefer constructor injection in new objects but may refactor to setter injection if the constructor becomes unwieldy.

Setter and constructor injection are equally supported by several open-source dependency injection containers.

DDJ


Around the Web

An Events Based Algorithm for Distributing Concurrent Tasks on Multi-Core Architectures

Here's a programming model which enables scalable parallel performance on multi-core shared memory architectures.

Quick Read

Swarm: A True Distributed Programming Language

The Swarm prototype is a simple stack-based language, akin to a primitive version of the Java bytecode interpreter.

Quick Read

Key Software Development Trends

Several trends are emerging within the area of software development. Here are some of the most important trends S. Somasegar has been thinking about recently.

Quick Read

Understanding Parallel Performance

Understanding parallel performance. How do you know when good is good enough?

Quick Read

Short and Tweet: Experiments on Recommending Content from Information Streams

The authors used 12 algorithms to study the URL recommendation on Twitter as a means of better directing attention in information streams.

Quick Read



Video

Forty finalists will gather in Washington, D.C. from March 11-16 to compete for $630,000 in awards.; DDJ; Intel; science; Dr. Dobb's talks with Commonsware's Mark Murphy about what's involved in developing software for the Android operating system; Android; apple; DDJ; tablet development; The new method uses analytics technology developed by the Mayo and IBM collaboration, Medical Imaging Informatics Innovation Center, and has proven a 95 percent accuracy rate in detecting aneurysm.; Algorithm; DDJ; diagnostics; ibm; imaging; T-Mobile USA is enabling phone calls to Haiti without charges for international long distance through January 31 and retroactive to the earthquake on January 12; DDJ; mobile; wireless; Al Williams gives you a demor of One-Der: The One Instruction CPU; DDJ; At the 2010 International Consumer Electronics Show, the auto industry's first working smartphone application was unveiled; DDJ; mobile; The Bluetooth Special Interest Group (SIG) has announced the adoption of BLUETOOTH low energy wireless technology.; bluetooth; DDJ; wireless; IBM has unveiled its list of five innovations that have the potential to change how people live, work and play in cities around the world over the next five to ten years; DDJ; ibm; TeliaSonera's LTE mobile broadband commercial network in Stockholm is now the fastest and largest in the world.; broadband; DDJ; ericsson; mobile; Google has introduced, google Goggles, a visual search application on Android devices that allows users to search for objects using images rather than words; Android; DDJ; google; mobile; Visual Search Applications; Dr. Dobb's talks with David Intersimone, Vice President of Developer Relations and Chief Evangelist at Embarcadero Technologies, about RAD Studio 2010, SQL optimization and his reflections on the software industry.; database programming; DDJ; sql; Researchers from Intel Labs have created an experimental, 48-core Intel processor or "single-chip cloud computer."; cloud computing; DDJ; Intel; multicore; parallelism; The Large Hadron Collider will produce roughly 15 million gigabytes of data annually, to be accessed by a distributed computing and data storage infrastructure called the LHC Computing Grid.; CERN; DDJ; grid computing; physics; A mobile handheld device designed to let users can point, shoot and listen to printed text.; DDJ; Intel; mobile; Ericsson has become the first vendor to prove end to end interoperability in TD-LTE, another standard of 4G radio technologies designed to increase the capacity and speed of mobile telephone networks.; DDJ; ericsson; mobile; TD-LTE; According to a recent study, 80 percent of US respondents feel there are unspoken rules about mobile technology usage, and approximately 69 percent agreed that violations of these unspoken mobile manners are unacceptable.; DDJ; Intel; mobile; IBM and Canonical will introduce a software package for netbooks and other thin client devices in Africa. This is the first cloud- and premise-based Linux netbook software package offered by IBM and Canonical.; cloud computing; DDJ; ibm; His unprecedented ability to manipulate individual atoms signaled a quantum leap forward in in nanoscience experimentation and heralded in the age of nanotechnology.; DDJ; ibm; nanotechnology; IBM honored for its invention of the Blue Gene family of supercomputers. Adobe founders also recognized.; adobe; DDJ; ibm; Former U.S. President Bill Clinton addressed thousands of online entrepreneurs from around the world gathered for the third APEC Business Advisory Council SME Summit in Hangzhou, China.; DDJ; e-business; With free cooling for several months a year, Sweden is an ideal location for cost-efficient data centers.; data centers; DDJ; PNC Bank introduces a new mobile App for the iPhone and iPod touch that provides Virtual Wallet customers with a high-def view of their money while on the go.; DDJ; iphone; The Swedish LTE site will be part of a commercial network scheduled to go live in 2010, bringing data rates far above what is possible in today's mobile broadband networks.; DDJ; ericsson; mobile broadband; Nanotechnology advancement could lead to smaller, faster, more energy efficient computer chips.; circuit boards; DDJ; nanotech; semiconductor; Dr Dobbs talks with with Claudia Backus, Senior Director of Ecosystem Programs at Motorola, regarding the company's recently released MotoDEV Studio for their Android-powered phones.; Android; DDJ; mobile; motodev; The Extremadura Regional Government of Spain and IBM have launched an electronic prescription system in 680 pharmacies in western Spain.; DDJ; ibm; Ericsson to Acquire Majority of Nortel's North American Wireless Business; DDJ; ericsson; mobile; telecom; Nintendo's Wii Sports Resort is an immersive, expansive active-play game that includes a dozen resort-themed activities.; DDJ; nintendo; video games; OnStar can remotely send a signal to the electronic system in the subscriber's stolen vehicle and the vehicle will not be able to be re-started.; cellular; DDJ; wireless; In celebration of the historic Apollo Moon landing, Google has released Moon in Google Earth.; DDJ; google; Ericsson has been awarded contracts with the three telecom operators in China to provide fixed broadband access.; broadband; DDJ; mobile; tv; wireless; Dr. Dobb's talks with Adobe's Adam Lehman about the upcoming release of ColdFusion specifically optimized for Flash and Adobe AIR platform delivery.; adobe; ColdFusion; DDJ; eclipse; Companies team to develop computing device and chipset architectures that will combine the performance of powerful computers with high-bandwidth mobile broadband communications and ubiquitous Internet connectivity.; broadband; DDJ; Intel; mobile; nokia; Adobe Systems and HTC recently announced that the new HTC Hero will be the first Android phone to ship with support for Adobe Flash Platform technology.; adobe; Android; cell phones; DDJ; flash; mobile; mobility; 3.2 million Euros awarded across eight prize categorie recognizing world-class scientific research and artistic creation.; DDJ; A parody of Paul Simon's "50 Ways to Leave Your Lover," but for software security nerds.; DDJ; sql; Dr. Dobb's Mike Riley talks with Jim Manias of Advanced Systems Concepts.  In this conversation, Jim discusses the new ActiveBatch 7 and how it can provide significant productivity gains for application developers and business process owners alike.; ActiveBatch; DDJ; Sun cofounder Scott McNealy and Oracle CEO Larry Ellison discussed Java's role in computing. Sun has also released OpenSolaris 2009.06.; DDJ; java; opensolaris; oracle; sun; Spotlight on NATO's centre of excellence on cyber defense in Tallinn, Estonia.; cyber defense; DDJ; nework security; security; Create Data Access Layers in ASP.NET; DDJ; In this demonstration you will learn how to layout a WPF application. We will explore the major layout panels that come with WPF, contrasting them with each other and describing when to use each.; DDJ; web development; windows; wpf; The Intel Foundation has announced the top winners of the Intel International Science and Engineering Fair; DDJ; Intel; News; science; Matt Hester demonstrates Internet Explorer’s 8 new feature Selectors API for utilizing CSS selectors for quick and easy element lookups.; DDJ; IE8; microsoft; windows; The NATO Virtual Silk Highway provides affordable, high-speed Internet access via satellite to the academic communities of the Caucasus and Central Asia.; DDJ; On a Windows Mobile device, applications are typically not closed down, but they stay in the background. Maarten Struys shows you a simple way to preserve battery power inside your own applications.; DDJ; microsoft; power consumption; windows; Windows Mobile Devices; Cadillac is now offering wireless Internet access with its CTS sedan.; DDJ; wireless broadband; By default, Windows Mobile Standard (Smartphone) applications launched from Visual Studio are not accessible on the device/emulator once they are minimized. In this video, Jim Wilson demonstrates two simple techniques to solve the problem.; DDJ; microsoft; smartphone; VIsual Studio; Mike Riley talks with the brass from Everypoint, creators of the NEMO mobile application development platform.; DDJ; Developers; development environments; mobile applications; Symmetric and asymmetric encryption algorithms, the SHA256 hash encryption algorithms, and how to implement in a simple application using Microsoft's Azure Services Platform.; Azure; DDJ; encryption; microsoft; security; windows; T-Mobile has introduced the Sidekick LX, which features enhanced video capability.; DDJ; Mobile Smartphone; Bluetooth 3.0 offers speedier transmission of large amounts of video, music and photos between devices wirelessly.; bluetooth; DDJ; mobile networks; wireless broadband; Cities around the world are battling with stressed transportation networks, so IBM has announced plans for three new smart rail projects in China, Taiwan and The Netherlands.; DDJ; ibm; ILOG; CASMOBOT is a Nintendo Wii remote controlled slope lawn mower.; DDJ; Denmark; nintendo wii; research; robotics; Project ensures documents, images, video and other Internet-based data growing at over 100 terabytes per month will live on for future generations; data storage; DDJ; history; Intenet; research; Sun Microsystems; Dr. Dobb's talks with Dave McAllister, Director of Standards and Open Source for Adobe, about the Open Screen Project.; adobe; DDJ; Open Screen Project; open source; The Facebook Connect SDK provides the code to let third-party developers embed hooks into their applications so users can connect to their Facebook accounts and exchange information using iPhone apps.; apple; cocoa; DDJ; Facebook; iphone; Mars in Google Earth Updated; DDJ; google; google earth; Google mars; red planet; The Sun Cloud is built on the Sun Open Cloud Platform that leverages the best in world-class open source technologies. The Sun Open Cloud Platform brings together Java, MySQL, OpenSolaris and OpenStorage.; cloud computing; DDJ; java; open solaris; sun; DDJ; High School; Intel; science; ILOG Elixir is a suite of professional user interface controls that gives developers a rich collection of innovative and interactive data display components for Adobe Flex and Adobe Air.; adobe; air; DDJ; elixir; flash; flex; ILOG; The inaugural San Diego Science Festival being held this month is touted as one of the largest multicultural, multigenerational, multidisciplinary celebrations of science ever seen on the West Coast; DDJ; lockheed; News; science; IBM has announced Innov8 version 2, a new version of its serious game that helps students and professionals hone their business and technology skills in a compelling, familiar video game format.; DDJ; ibm; serious games; Swiss Automobile Visionary Frank M. Rinderknecht builds a concept car with adaptive energy concept and iPhone controls.; apple; Concept Car; DDJ; iphone; j; siemens; Two-Year Plan to Focus on 32 Nanometer Manufacturing Technology; 32 nanometer technology; chip; cpu; DDJ; gpu; Intel; manufacturing; Nehalem; Westmere; New version features ocean layer, historical imagery, and more.; DDJ; google; Dr. Dobb's talks with Marty Alchin, author of "Pro Django" about his book and the deep internals of the Django framework.; DDJ; Django; A new content-authoring solution for learning professionals; adobe; DDJ; toolkits; web authoring; In a Second Life setting, Danny Coward discusses Java FX with Dr. Dobb's Jon Erickson.; DDJ; java; JavaFX; sun; The Core i7 processor is the first member of a new family of Nehalem processor designs with new technologies that boost performance on demand.; chip; DDJ; Intel; processors; Dan Diephouse, creator of XFire, a high-performance open-source SOAP framework (which became the Apache CXF project), shares the five common mistakes in SOA governance and insight about the Apache CXF and Mule RESTpack development environments.; apache; Apache CXF; DDJ; mule; open source; soa; soap; Xfire; Adrian Kaehler and Gary Bradski discuss the Open Computer Vision Library (sourceforge.net/projects/opencvlibrary/) and their book "Learning OpenCV".; DDJ; Open Computer Vision Library; OpenCV; In the first part of this two-part interview, Stephen Wolfram reflects on the 20-year anniversary of Wolfram Research.; DDJ; Mathematica; Mathematics; science; In the second part of this two-part interview, Stephen Wolfram discusses his book "A New Kind of Science."; DDJ; Mathematica; Mathematics; science; Nick Hodges talks about Delphi 2009, a RAD tool for Windows, and Delphi Prism, a database engine for Windows, Mac OS X, and Linux.; DDJ; delphi; RAD; windows; Dr. Dobb's talks with Tony Lombardo, lead Technical Evangelist at Infragistics, about all new UI tools for Windows and .NET.; .net; DDJ; silverlight; ui; windows; wpf; Dr. Dobb's talks with Eric Schulz about his International Mathematica User's Conference 2008 presentation on the Mathematica Essentials Palette and the future digital educational material; DDJ; Mathematica; Mathematics; Dr. Dobb's talks with ActiveState's Trent Mick about the recently released Komodo IDE 5.0.; DDJ; ide; open source; Dr. Dobb's talks with Continuity Logic's Kris Carlson about "Why We Die: Simulation of the Evolution of Senescence" and why he programs with Mathematica's functional programming language.; DDJ; functional programming; Mathematica; simulation; Ericsson collaborates with Intel; DDJ; ericsson; Intel; Mobile technology; Dr. Dobb's talks with Schoeller Porter about the grid and cloud versions of Mathematica; clouds; DDJ; Grid; Mathematica; Dr Dobb's interviews Yehuda Katz, maintainer of the Merb project, about the advantages this highly optimized Ruby on Rails alternative offers to web application developers.; DDJ; Ruby on Rails; Dr. Dobb's talks with Thomas Roman, Professor of Mathematics at Central Connecticut State University, about "Mathematica Visualization in a Theoretical Physics Problem - Negative Energy in an Unusual Quantum State."; DDJ; Mathematica; physics; quantum; science; The Forbidden City: Beyond Space & Time is a fully immersive, three-dimensional virtual world that recreates a visceral sense of space and time.; Blade Server; China; DDJ; ibm; linux; mac; online; virtual world; windows; Dr. Dobb's interviews open source luminary Miguel de Icaza about his latest milestone of achieving Microsoft .NET 2.0 Framework compatibility with the Mono Project .; DDJ; Dr. Dobb/s interviews Paul Kimmel, author of "LINQ Unleashed for C#", about Microsoft's new query technology that lets developers poll any information from any data source regardless of location or structure. I; C#; DDJ; Dr. Dobb's; LINQ; microsoft; It takes a supercomputer to build a super car. ; DDJ; HPC; simulation; Dr. Dobb's shows how to install and execute cross-platform scripting languages on the Windows Mobile platform. In this installment, Mike Riley examines Perl for Windows Mobile devices.; DDJ; mobile devices; perl; windows; Dr. Dobb's shows how to install and execute cross-platform scripting languages on the Windows Mobile platform. In this installment, Mike Riley examines Python CE which is optimized for Windows Mobile devices.; DDJ; mobile devices; python; windows; Dr. Dobb's shows how to install and execute cross-platform scripting languages on the Windows Mobile platform. In this installment, Mike Riley examines Ruby for Windows Mobile devices.; DDJ; mobile devices; ruby; windows; Young participants at ITU TELECOM ASIA 2008 in Bangkok, Thailand received free laptops as part of ITU’s initiative to promote affordable devices to increase access to information and communication technologies.; communication; DDJ; itu; Currently technical strategist to Microsoft's Chief Software Architect, Rebecca Norlander has had a tremendous impact on Excel, Internet Explorer, Windows XP SP2, and Windows Vista Security. ; DDJ; microsoft; Contributing authors to the book "Beautiful Code" got together at Dr. Dobb's SD West Conference in March, 2008. Part 1 of 3.; DDJ; programming; software development; Contributing authors to the book "Beautiful Code" got together at Dr. Dobb's SD West Conference in March, 2008. Part 2 of 3.; DDJ; programming; software development; Contributing authors to the book "Beautiful Code" got together at Dr. Dobb's SD West Conference in March, 2008. Part 3 of 3.; DDJ; programming; software development; Anders Hejlsberg discusses C#, Turbo Pascal, and what it means to design a programming language. ; C#; DDJ; microsoft; Turbo Pascal; Solar powered laptops given to youths at ITU Asia 2008.; DDJ; News; telecommunications; IBM breakthrough stands to impact future direction of information technology.; DDJ; Mike Riley spoke to ActiveState's Jeff Hobbes about the new features in Tcl Dev Kit and Perl Dev Kit including the code coverage and hot-spot analysis tool and Mac OSX support.; DDJ; Tim O'Reilly addressed the OSCON convention in his Wednesday keynote titled "Degrees of Freedom, Open Source in the Wed 2.0 Era.; DDJ;


Enabling People and Organizations to Harness the Transformative Power of Technology