Wednesday, October 22, 2008

Timeless Software

Sitting in the newly refurbished cabin of a Lufthansa 747, I cannot help but marvel at the continuous evolution of this beautiful plane. First released in the 60s, before I was born, this machine is so fundamentally different now, modern cabin, modern cockpit, new communication systems, navigation systems, engines, and yet it is essentially the same as when it was first born. The same principles of flight, the same reliability, the same optimizations around the essentials of travel requirements, fuel consumption, and maintenance.

As we at SAP have learned over the years, 36 years after delivering our first packaged application, successful large scale enterprise software follows essentially the same lineage. It solves fundamental problems that businesses face every day, over generations of business change and of technological change and, in doing so, it continuously evolves in a constant cycle of renovation. I call this Timeless Software, and want to write here about what some of its fundamental characteristics are, and how it will help define our software for the next several generations of changes to come.

Where We Are

SAP’s software today covers a massive breadth of business activities. Functionality in the Business Suite covers a large spectrum of business processes, from finance and human resources to sales and service, from planning and procurement to manufacturing and logistics, from managing supply chains to managing business strategy, decision-making and compliance, and others. In addition, its functionality spans variations on these processes across 100+ countries and 25+ industries. Despite this massive reach, customers expect a fundamental degree of coherence, stability, reliability and integration across the various elements of such software. The expectation of stability, given the mission critical nature of many of these business processes, coupled with the fundamental ways in which business deploy and use the software to mirror their own business and its uniquenesses, means that our software and our relationships with customers, are very long-lived and often last decades. Over this long lifespan, customers simultaneously expect the software to contribute to their two fundamental metrics:

  1. Costs, by ensuring that the software is integrated and comprehensive, and easy to reliably operate and cheaply administer, and
  2. Growth, by ensuring that the software addresses differentiated areas and is easy to evolve, change, and integrate into others as necessary

So this, then, is the essential duality that our customers expect from their IT landscape: Deliver operational efficiency via coherence and stability, while enabling business growth and managing change necessary to survive and grow. And this becomes our prime requirement: Enable evolution of our software without disruption; provide a large breadth of stable functionality, over generations of change. And it is around this requirement that we seek to design and architect the evolution of our software.

What is the nature of this change dynamic? Business requirements change all the time; markets evolve, circumstances governing customers’ purchase of products change constantly, businesses are bought and sold, regulations change, and just the day-to-day challenges of competing require a constantly shifting and evolving IT landscape. But change occurs at other layers as well. People’s behavior evolves constantly. There are now millions of blackberry carrying business users worldwide, who carry out quite of a bit of their tasks outside their office. This year we estimate that nearly a billion people worldwide will conduct some or the other business activity on a mobile device. The technological layers change as well. Every year we see roughly two new major UI paradigms. Just in the last 3 years, we have seen the iPhone, Google’s work on Google maps and highly interactive web applications enabled by AJAX, Adobe’s work with AIR, Microsoft’s work on Silverlight and others. Even programming languages, and programming models around them, continuously evolve. Roughly every 10 years a major new language emerges, and minor ones every 3 years or so, well within the lifecycle of large scale applications. And programming models and developer communities emerge around these. The language Ruby, for example, is thought to have reached a million programmers faster than any other language ever. The three key infrastructural building blocks: processors, network and memory, evolve continuously and often non-linearly as well. And this evolution sometimes enables or requires, new architectural paradigms. For instance, cheap main-memory and elastic farms of simple servers have enabled fundamentally new ways of analyzing large amounts of data. Similarly, multi-core processors require rethinking application programming to better utilize their parallelism or risk slowing down. So large scale software, over its lifetime, is subjected to change continuously, business change, as well as change across all the technology layers that it inhabits.

As I look to the future, evolving our products for the next generation, this becomes our essential challenge: How do we build applications to serve the needs of every user, and every activity, in every business around the world? And how do we do so effectively, efficiently and with maximum coherence? And how do we evolve these applications, their ongoing change, consumption, delivery and integration, as well as their connection to the present, across generations of change? How do we deliver software that is always reliable, and yet always modern? In other words, how do we build timeless software?

Enterprise applications are built using a collection of programming models and languages that describe their content, are executed using a set of corresponding containers or run-time, and continuously change over their lifetime. My sense is these three constructs form the essence around which we need to understand Timeless Software, its characteristics and how we build it:

- Content, i.e. the application content, the UI content, the integration content, to represent and serve the activities of users
- Containers, i.e. the runtime(s) that this content inhabits, and
- Change, i.e. the ongoing operation and evolution of both the content and the containers over the lifecycle of a solution while maintaining a continuous link with the past

There are other aspects, to be sure, but these are the three basic ones and I want to share my view on their evolution next.

The Evolution of Content Creation

Enterprise systems cannot rely long-term on any one programming language. Alan Kay once observed that there is a major new language every ~10 yrs and several minor ones in the interim. So over its life span, a major enterprise system sees adoption curves of several languages. Just in the last several years we have seen very rapid adoption of .Net languages, Ruby, Python/Perl/Php, Javascript, and others. Perhaps even more interestingly, programming models emerge around these languages, and often the success of a programming model, e.g. JEE or Ruby-on-Rails, brings with it a large community of programmers, drives the adoption of the language, and an explosion of software artifacts around it.

But lots of languages and dialects also exist for other reasons: There are many different domains & problem characteristics within enterprise systems and for each domain, unique combinations of syntax, tooling conveniences and programming models emerge over time. From Jon Bentley’s “little languages” to the modern-day notion of “domain specific languages”, there are many variations in essentially the same exercise: expressing meaning in convenient, specialized ways. There are programming models and domain-specific languages around User Interfaces, for instance. Data has lots of variations too. Modeling and querying business data, languages for reporting and analytics, for search (as Google showed with their map/reduce programming model), for managing XML based or other hierarchical data, and others. Describing flows, events, rules, software lifecycle, and other aspects each bring their own variations, and the same thing happens in specific application areas and in particular industries. Over time, with successful adoption, these abstractions and conveniences increase. Our own ABAP, for instance, saw several programming models integrated within a general purpose language: abstractions and extensions for data access, for reporting, for UI, even object-oriented programming within ABAP, in the form of ABAP objects. Java, similarly, grew over the years in lots of domains and ultimately the JSR institution served to systematize the inclusion of extensions and programming models within the language. And there are similar examples in other domains, in hardware design for instance. Even cliques of teenagers invent their unique DSLs for texting.

Another key source of diversity in programming stems from the nature of the programmers. Programmers bring different degrees of training/understanding in computer science concepts, in business, and in particular domains. So languages and language constructs, as well as specific abstractions emerge for different programmer segments, be it system programmers, business analysts, administrators, or others.

This diversity is great, insofar as it enables abstractions and separation of concerns, so different classes of problems are dealt with uniquely. After all, the world does not speak one language, as any visit to the UN assembly hall would demonstrate. But the challenge is the resulting complexity that these isolations create. The various abstractions/specializations lead to islands of diverse, non-interoperable languages, language run-times and software lifecycles. Like barnacles attaching themselves to a host, these variations often lead to increased landscape complexity and dramatically higher costs of operation.

So my sense is we need an enterprise programming model that is deeply heterogeneous yet integrated. One that enables expression of meaning in a wide variety of simple and convenient ways, including ways yet to be invented, without losing coherence. One that:

1. Enables developers across lots of domains and specializations to use their native abstractions and conveniences

2. Uses a family of integrated domain-specific languages and tooling conveniences to build software artifacts with maximum efficiency and productivity

3. Has a powerful glue that binds these diverse elements together

4. Can be extended by communities and developers of various sorts in lots of different ways, and

5. Can integrate the next great languages, including languages yet to be invented, and can itself be renovated and embedded in other programming models

Some advanced development work we’ve done in our labs indicates that such an integrated design-time environment is indeed possible and can bridge a heretofore uncrossed divide between families of highly specialized DSLs that are yet integrated into a coherent whole. A key piece of this puzzle is a glue that binds the various DSLs together. The glue in this case, is a mechanism that takes a base language, such as Ruby, and uses capabilities such as reflection to extend the base language with the grammar of new DSLs in a seamless way. The timelessness comes from being able to add new DSLs dynamically to the base language, completely incrementally, without knowing about these in advance. We have experimented with several DSLs that plug into a glue and the glue in turn integrates seamlessly into a base language such as Ruby or Javascript. In a promising effort conducted by our SAP Research team, we have demonstrated how standard Ruby code can be run natively inside the ABAP language run-time, thereby achieving the benefits of both flexibility in Ruby programming and the enterprise-grade and robust Abap environment. I see several exciting developments ahead along these lines that will lead us to new paradigms in extremely efficient content creation without losing coherence.

The Evolution of Containers: Next runtimes

Enterprise run-times are faced with a significant challenge of optimizing the execution of the diverse and heterogeneous language landscapes described above. So if the content is to be built with maximum efficiency of expression and flexibility, then the containers need to enable maximum efficiency in execution. Our key challenge then is to bridge this divide between flexibility and optimization. In layered architectures, and with the first several years of service-oriented architectures behind us, we often take it as a maxim that the benefits of flexibility and abstraction come at the expense of optimization. That layers of abstraction, by creating an indirection, usually cost in performance. But I believe this is a false divide. Run-times need to separate meaning from optimization, and diversity in design-times need not lead to heterogeneity in run-times.

More than a decade ago, I examined one aspect of this issue in my own Ph.D. work, in looking at how meaning, specified in highly generic logic-based languages, could be executed optimally using specialized procedures that could cut the layers of abstraction to achieve significant optimization compared to a generic logical reasoning engine. The principle underneath this is the same one -- by separating meaning from optimization, a system can provide both: the efficiency and generality of specification in a wide variety of specialized dialects interoperating over a common glue, and a very efficient implementation of that glue down to the lowest layer possible in the stack, across the layers of abstraction

There are examples of this principle at work in other areas in our industry. The OSI stack implements seven very clean layers of abstraction in the network, and yet a particular switch or a router optimizes across these layers for extreme runtime efficiency. Hardware designers, similarly, use a variety of languages to specify various hardware functions, e.g. electrical behavior, logical behavior or layout, and yet when a chip is assembled out of this, it is an extremely lean, optimized implementation, baked into silicon. Purpose-built systems often can dictate their requirements to the platform layers below, whereas general-purpose systems often do not know in advance how they will be utilized, and can often be suboptimal compared to purpose-built systems, but more widely applicable.

But beyond crossing the layers of abstraction, run-times have an additional burden to overcome. In enterprise systems, we are often faced with tradeoffs in managing state across boundaries of processes and machines. There are three key building blocks in computing: networks, i.e. moving data around, processors, i.e. transforming data, and state, i.e. holding data, in memory or on a disk, etc. And different types of applications lend themselves to differing optimizations along these three dimensions. Several years ago, when dealing with some difficult challenges in advanced planning and optimization, our engineers did some pioneering work in bringing applications close together with main-memory based data management in our LiveCache technology. The result, implemented successfully in our APO product in supply-chain management, demonstrates how locality coupled with a highly purpose-built run-time offers a unique optimization on network, state and processing. More recent work in business intelligence demonstrates that when it comes to analytics, a great way to achieve performance improvements and lowered costs, is to organize data by columns in memory, instead of in disk-based RDBMSes, and perform aggregation and other analytical operations on the fly on these main-memory structures. Working together with engineers from Intel, our Trex and BI teams achieved massive performance and cost improvements in our highly successful BIA product. We are now taking this work a lot further; in looking at ways to bring processing and state close together elastically, and on the fly, and by looking at ways that the application design can be altered so that we can manage transactional state safely, and yet achieve real-time up-to-date analytics without expensive and time-consuming movement of data into data warehouses via ETL operations. SAP’s founder Hasso Plattner inspired me to do an experiment we dubbed Hana, for Hasso’s new architecture (and also a beautiful place in Hawaii), our teams working together with the Hasso-Plattner-Institut and Stanford demonstrated how an entirely new application architecture is possible, one that enables real-time complex analytics and aggregation, up to date with every transaction, in a way never thought possible in financial applications. By embedding language runtimes inside data management engines, we can elastically bring processing to the data, as well as vice-versa, depending on the nature of the application.

Enterprise systems with broad functionality, such as the Business Suite, often need several types of these optimizations. One can think of these as elastic bands across network, state and processing. Large enterprises need transactional resiliency for core processes such as financials, manufacturing and logistics. They need analytical optimizations, ala BIA, for large-scale analytics over data. They also need LiveCache style optimization for complex billing and pricing operations. They need to support long-running transactions to support business-to-business processes that work across time zones, they need collaborative infrastructure for activities such as product design, and others. Each of these patterns consumes the underlying infrastructure, memory, network and processing, in fundamentally different ways. This breadth is one key aspect that the existing SaaS offerings are extremely narrow in scope. Serving broad enterprise functionality off the cloud is a fundamentally different architectural challenge, than taking a niche edge application, such as sales force automation or talent management, and running it off what is essentially a large-scale client-server implementation. My sense is that enterprise ready cloud platforms will enable extremely low costs of running cloud services that have a broad footprint: transactional, analytical, long-running and others, with extreme ease of development and extensibility. We have some early promising results in these areas, but neither the current SaaS offerings, nor any other cloud platform I am aware of, can address this challenge for the foreseeable future.

So to summarize, I believe the next great run-times will implement the glue at lowest levels possible in the stack, cutting across the layers of abstractions that make developers’ lives easy at design-time but are not needed at run-time. These runtimes will flexibly enable various different application-oriented optimizations across network, state and processing and will enable execution in specialized containers or consolidated containers, in elastic, dynamically reconfigurable ways. This deployment elasticity will take virtualization several layers higher in the stack, and will open new ways for customers to combine flexibility and optimization under one unified lifecycle management, the final piece of the puzzle.

The Evolution of Change: Lifecycle Management

Perhaps the most important piece of this trichotomy is the third one: Change, i.e. managing the lifecycle of a system over the continuous change in its contents and containers. Enterprise software lives a very long time, and changes continuously over this time. Developers often do not often think beyond delivery and lifecycle mgmt is often an afterthought, and yet this very lifecycle management is the only constant in a usually very long life of an enterprise system. It is the embodiment of the relationship that the system maintains with the customer, over several generations and it encompasses several aspects: change in functionality, change in deployment, integrating a new system with an existing one, ongoing administration and monitoring.

One of the fundamental pre-requisites of lifecycle management is the ability to precisely describe and document existing or legacy systems. This documentation, whether it describes code, or system deployment, is a critical link across a system’s life. ABAP systems have well-defined constructs for change management, software logistics, versioning, archiving, etc., as well as metadata for describing code artifacts that makes it easier to manage change.

Consuming legacy software often means understanding what is on the “inside”. Well-defined wrappers, or descriptors, of software can help with this. But it is also often necessary to carve well-defined boundaries, or interfaces, in legacy code. Such firelaning, which has long been a practice in operating systems to evolve code non-disruptively, is essential to managing code’s evolution over the long haul. Service oriented architectures are a step in this direction, but having legacy code function side-by-side with “new” code often requires going far beyond what the SOA institution has considered so far. It requires having data, especially master data interoperability, enabling projections, joins and other complex operations on legacy code, having lifecycle, identity, security, and versioning related information about the legacy code, having policies in place to manage run-time behavior, and other aspects. Most of these steps today are manual, and enterprises pay significant integration costs over a system’s lifetime to manage these. Over time I see this getting significantly better. But it starts with provisioning, or enabling, existing code to behave in this manner, carving nature at her joints, as Alan Kay once told me the Greeks would say. I also see incumbents with an existing enterprise footprint, as having a significant advantage in getting here. It is often far easier to carve a lane out of existing code, than it is to replace it.

Great lifecycle management is the essential change management mechanism. My sense is, next generation lifecycle management will enable systems that can easily be tried, consumed, extended, added to, removed from, projected on, integrated with, etc. This will be achieved by enabling every artifact in a system to be measured, managed, and tested. We will see existing and legacy code being instrumented for administration, for documentation as well as for integration. This will require us to provide precise mechanizable specification and documentation of all important aspects of the system as a key ingredient. The specification of a system’s behavior, its usage, service-levels and policies describing its operation, especially for security, access and change, will be fundamental to this. We already see efforts in this direction towards precise, mechanized specifications of system behavior and we will see more of this. SAP has already taken some steps in this direction with our enhanced enterprise support offering, that enables a business to lifecycle manage system landscape across their entire business from one console.

Deep interoperability between design-times, run-times and lifecycle management, will enable us to combine deployment options in ways that were not possible before. For the foreseeable future we see customers employing some parts of their processes as on-demand services, but deploying most of their processes on-premise. Our lifecycle management frames will ensure that customers can make such deployment choices flexibly.

The evolution of our products along Timeless Software

Our portfolio of products, starting with the Business Suite, including Business Objects and NetWeaver and Business ByDesign, will continually evolve along these principles of timeless software.





As the picture above illustrates, we will continue to enhance our massive yet coherent breadth of functionality, to reflect ever increasing business activities across industries, geographies, and roles. This functionality will be built and extended using an evolving programming model, often in languages that have not yet been invented. And will be deployed in new ways, in the cloud, as appliances, on-premise, and all of the above. This functionality will be exposed for wide varieties of consumption, across consumers, business user workplaces, and devices, rendered via a wide variety of specialized client-side technologies, built by SAP as well as others. And yet all of this functionality will be under the same lifecycle frame, the backbone that will support the constant evolution, and constant optimization of our landscape at our customers. Our products will therefore reflect these principles. We will continually carve new lanes, and deliver new functionality, even deep new technologies. The applications will evolve continuously, and piecewise, as nature does: bringing new things, renovating others, adding here and retiring there, and doing so without breaking its essential qualities: reliability, integrity, integration, seamless administration, change and lifecycle management. Just as every few years we humans shed most of our cells, acquire new memories and lessons, decisions and beliefs, evolve and yet stay essentially who we are, I believe it is possible for software to renovate itself completely, and yet continuously.

So as excited as I am looking ahead to innovations on the horizon and beyond, that there is tons of new technologies, new capabilities, and new functionality to be delivered in our software, it is perhaps most reassuring that none of these will break the essential promises at the heart of timelessness, of reliability, integrity, coherence and continuous evolution.

On that reassuring thought, it is time to press the bed button on my seat and try out the fancy new lie-flat bed to end a day that began already 3 timezones away, 20 hours ago. And as I browse thru the 80 movies onboard, and notice the flight monitor displaying the plane’s airspeed of 567 miles/hr, things that passengers 40 years ago couldn’t have imagined, I find myself thankful for being in the comfort of a well engineered timeless system.

51 comments:

monkchips said...

nice to see you in the blogosphere Vishal. a very thorough and comprehensive post. a couple of suggestions-
1. you need to break up the text a little with line spacing so its easier to read.
2. you should be using Wordpress.
3. its always a good idea to link to other people's thoughts and blogs, which puts yours into context, and helps create a conversational dynamic because of the awesome power of the trackback. I will take the liberty of pointing at my own take on timeless software: http://www.redmonk.com/jgovernor/2008/10/17/on-timeless-software-pace-layering-and-the-sap-software-architecture/

good to see you though, and i look forward to seeing this blog evolve.

Benjamin said...

I'll add my welcome to that of James - and the vote for WordPress too, although I'm a little biased.

I share you respect for the 747's lifecycle. I wonder which software products will still be around when my children have grown up, so that they can say "this was written before I was born"?

I think you've got three posts in one here, we're living in the sound-bite generation, go easy on us with the long stuff ;). Great writing though!

The technology industry seems to suffer from a frenetic restlessness. Constant change. I'm very interested to read more of your thoughts on timeless software.

vidacavallaro said...

0951成人頻道下載,免費視訊聊天,成人網站,色情守門員,成人貼圖區,成人視訊,自拍美女,0204貼圖區,聊天室ut,ec成人,成人視訊,哈啦聊天室,dodo豆豆聊天室,台灣情色網,69成人,小高聊天室,免費交友,咆哮成人繁體,貼圖片區,正妹百人斬,正妹走光,正妹桌布,免費視訊聊天,1069交友,美女交友,080視訊聊天室,6k聊天館,巨乳,失落的世界聊天,色聊天室,成人視訊,玩美女人,嘟嘟成人網,情色交友網,成人電影,影音視訊聊天室,一葉情貼圖片區,情色視訊,交友聯誼,av美女,

娃娃 said...

人因夢想而偉大,要堅持自己的理想哦!..................................................

直到遠遠 said...

以簡單的行為愉悅他人的心靈,勝過千人低頭禱告........................................

那ㄟ安呢 said...

nice to know you ~........................................

book said...

期待你的下次更新喔^____^.........................

楊DodieSeaver0202 said...

I love readding, and thanks for your artical.........................................

LaciRossetti199 said...

援交女豆豆出租情人視訊sogo論壇視訊辣妹桃園兼職援交辣妹視訊一對一視訊520sex日本視訊小魔女自拍av1688影音娛樂網辣手美眉甜心寶貝直播貼片免費色咪咪視訊網pc交友視訊美女ggoo免費視訊情色網咆哮小老鼠高雄援交夢中情人情趣用品sex888免費看影片波霸美女寫真sex888免費看影片視訊新竹援交留言0401成人聊天室甜心寶貝貼影片援交友留言桃園sogo 論壇080情人網視訊泳裝秀拓網交友色美眉免費看視訊免費色咪咪影片網 兼職援交聊天室ilover99a片天堂卡通aa片台灣情色網無碼avdvd色色網sexy diamond sex888入口高雄視訊辣妹自拍免費a片亞洲東洋影片hilive本土自拍天堂西門慶成人論壇 費 aaa 片試看dudu sex免費影片avdvd一夜情色妹妹免費情慾影片觀賞qq美美色網影片av免費影片日本 a 片自拍偷拍網站情色小說jp成人a 片日本avdvd女優xxx383美女寫真日本avdvd小魔女免費影城無碼avdvd無碼卡通情色情色論壇甜心寶貝貼片區Show-live視訊聊天室 情色免費A片情色偷拍免費A片一本道 a片 東京熱avdvd影片色美眉台中援交aa 片試看aaa 片試看情人輔助品成人網站做愛自拍偷拍免費試看av免費成人電影dudu sex免費 aa 片試看臺灣情色網線上免費a長片0204免費a片試看a片免費試看a片天堂台灣論壇成人a漫畫免費視訊聊天ing免費視訊美女aaa影片下載城卡通aa片免費看成人影片分享視訊聊天評比104免費成人情色文學小說

裕以 said...

Good Job!!......................................................................

PabloDuda0若愛 said...

「不可能」這個字詞,在聰明人的字典中是找不到的。 ..................................................

淑娟 said...

廢話不多,祝你順心~^^........................................

AshantiHallenb54165 said...

看到你的好文章真是開心 加油囉.......................................

韋于倫成 said...

處順境須謹慎,處逆境要忍耐。 ..................................................

韋成 said...

財富並非永遠的朋友,但朋友卻是永遠的財富。 ............................................................

茂一 said...

快樂,是享受工作過程的結果...........................................................................

峻君 said...

人生最大的榮耀,不是永遠不敗,而是屢仆屢戰..............................

靖綠 said...

不錯唷~我會常常來 >"<..................................................

姵潔 said...

想像是什麼並不重要,想像能做什麼才重要......................................................................

則惠 said...

我來湊熱鬧的~~^^ 要平安快樂哦.....................................................................

育財 said...

支持好的blog~繼續加油~~

許紀廷 said...

死亡是悲哀的,但活得不快樂更悲哀。......................................................................

佩春 said...

河水永遠是相同的,可是每一剎那又都是新的。.................................................................

于庭 said...

成熟,就是有能力適應生活中的模糊。.................................................................

佳皓佳皓 said...

走過路過~不能錯過~哈哈............................................................

ToryO_Viss鈺雯er0316 said...

在你一無所有的時候 是誰在陪伴你 他便是你最重要的人............................................................

吳婷婷 said...

字是活的,人和環境的觀察是活的,思想是活的。不管怎樣,就是要有一兩樣是活的。否則都是平庸。............................................................

佳伸佳伸 said...

寫文章需要心情~~期待你再一次的好文章............................................................

倫妍倫妍 said...

人生的苦惱,不在擁有太少,而在奢望太多。..................................................

林柏毅林柏毅 said...

命運,就是自己行為的結果。..................................................

方偉白方偉白 said...

「仁慈」二個字,就能讓冬天三個月都溫暖。..................................................

琬安琬安 said...

與人相處不妨多用眼睛說話,多用嘴巴思考. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

CedricD_Mccloud07043.3 said...

你不能決定生命的長度,但你可以控制它的寬度..................................................................

吳彥宇 said...

所有的資產,在不被諒解時,都成了負債.................................................................

仲惠娟惠娟亨 said...

你不能改變容貌~~但你可以展現笑容.................................................................

家唐銘 said...

享受你自己的生活,不要與他人相比。......................................................

雅佳謙筑 said...

Quality is better than quantity.............................................................

文王廷 said...

缺少智慧,就是缺少一切..................................................

文王廷 said...

在你一無所有的時候 是誰在陪伴你 他便是你最重要的人......................................................................

旻睿張旻睿張旻睿張 said...

友誼能增進快樂,減少痛苦......................................................................

瑰潼 said...

在莫非定律中有項笨蛋定律:「一個組織中的笨蛋,恆大於等於三分之二。」..................................................

孫邦柔 said...

愛情不是慈善事業,不能隨便施捨。.................................................................

佳張張張張燕張張張張張 said...

No pains, no gains..................................................................

陳昆珍 said...

與人相處不妨多用眼睛說話,多用嘴巴思考,..................................................... ............

文岳仲君 said...

期待你的下次更新喔^____^..................................................

john williams said...

Hi..i am kartik,, thanks for sharing a vailable information in sap hana SAP HANA

kiran hirdae said...

Good sir!!

manoj lonar said...

Congrats on becoming a CEO of Infosys. Read your article on ToI, "Infosys CEO Vishal Sikka: 7 things to know".
Thanks,

Manoj Lonar

Ajay4500 said...

Excellent comprehensive piece. Heartiest congratulations on getting into the Drivers seat at Infy. Read your bio, interviews and your first mail to employees. Infy can truly look forward to some exciting times and transformations. Would like to see Infy focus more and better on Public/Social Sector in India and Region.
Best wishes,

James Brown said...

Pretty good I just stumbled upon your blog and wanted to say that I have really enjoyed reading your blog posts. Any way I'll be subscribing to your feed and I hope you post again soon. Big thanks for the useful info.
architects in Pakistan

John Adam said...

Civil engineering or architecture?!?
business architecture software