Tag Archives: Productivity

3-Step approach to evolutionary innovation

In my last blog post, I explored why everyone isn’t innovating if it’s so important. I surmised that innovation can be evolutionary as well as revolutionary. In this scenario, I would like to offer 3 steps to approach evolutionary innovation.

How is it possible to have your cake and eat it – to keep up with your urgent tasks while moving forward at the same time? Various solutions have been put forward, such as the idea of bimodal IT.

From what I’ve experienced, a good, pragmatic approach is to follow what is sometimes called “evolutionary innovation”. By building incrementally on what you have, it’s often possible to push forward with innovation without putting everything else on hold or disrupting business-as-usual.

Let’s look at how to approach evolutionary innovation under three headings:

  1. Build on what you have
  2. Make the most of the available ideas
  3. Be ready to fail

Uniface Innovation

  1. Build on what you have 

An idea doesn’t have to be brand new to be innovative. It’s often about doing the same thing better. Think about mobile phones. An initial step was going from wired to cordless. Since then, we have seen a lot of evolutionary steps, bringing us to the smartphones we use today. There have of course been some revolutionary jumps; however, for the most part, the innovation has been evolutionary.

Rather than await a flash of inspiration and light-bulb “eureka moment” – going from nothing to revolution – we can innovate by listening to people’s challenges and turning these into creative new ideas.

Those ideas can often be implemented with what you already have. In the case of IT innovation, it’s possible to work with solutions that take care of encapsulating technical complexity. That way, you can quickly utilize your existing business assets, getting more out them, with zero (or minimal) rework effort. For example, you may be able to move a legacy application to the web without rewriting core business code. This means you have the time and resources to go on continuously improving your solutions to keep pace with business, consumer and technological change.

  1. Make the most of the available ideas 

It’s important to listen to what other people are thinking – everyone is innovating. The best ideas of all will often come from your own workforce, so it is important to find ways to develop this important resource. With the consumerization of IT and the 24×7 access available to users, particularly through smart devices, the era of apps, bots and assistants sparks many ideas and demands. Combined with the many continually improving features available on these devices, the scope to innovate is immense.

Organizations should try to provide employees with “play time”. Children learn and very rapidly develop through playing; the adult version of this is called R&D. Unfortunately, as we mature, the amount of play appears to decline. Organizations should aim for a range of individual and group activities such as personal experimentation time and team hackathons. It’s important to include individual activities as well as group ones because not all ideas come to the surface in the context of a group, especially if a few people are particularly dominant. As simple as this last statement may seem, it is often overlooked.

The trick is to strike the right balance between business tasks, prescribed learning, and play time. When you hit the sweet spot, you may be surprised how many ideas you have at your disposal – who knows, you may even have enough to spin off additional solution offerings or even new business entities.

  1. Be ready to fail 

With any form of innovation, you must be prepared for some of your ideas not to work. Eddie Obeng’s TED talk on Smart Failure for a Fast-Changing World memorably captures why this is so important. We don’t experiment enough, and although companies pay lip service to the idea that it’s OK to fail, they often find it hard to follow through.

This is one of the biggest blockers to innovation, and we need to overcome it. We have to find ways to experiment with new ideas, some of which will fail. We must ensure that businesses of all sizes fully understand and account for this requirement. If we take the phrase “Be ready to fail” and replace the word fail with experiment, test, try, learn, play, develop, grow, evolve or many similar words, the emotional response is very different – however, the end goal remains the same. Whatever word we choose, the process of innovation is normally iterative. It is important to understand this principle and not give up at the first hurdle.

This series is based on the paper: Agility and Innovation in Application and Mobile Development. You can download the paper here.

New Year’s Resolution

These are the first lines I write in this new year, 2017. I want to start with wishing you all a very good and successful year. How strange is it. On New Year’s Eve we look back, while on New Year’s day we make plans and start with our New Year’s resolutions.

Some things will start, some have ended and some continue. For most of us, Uniface is one of those continuing. As I wrote before, sometimes I wonder how long it shall. But on the other hand, why care. There are thousands of software development tools. Most of them are bigger (whatever that may be) and perhaps some better than our beloved Uniface. The concept of programming is, from a certain point of view, always the same. Sure, you need to learn. You quit being a Uniface senior to become a junior in something else. You will enter a whole new world, with new and probably many young software developers. And between these hipsters you are the oldest junior they have ever seen. Wow, interesting, isn’t it? Your New Year’s resolution can be becoming a junior again!

In a previous blog I’d bet you a beer. I wrote about this company where I once worked. They tried several software development platforms. Maybe they found something else more tempting. Eventually they did choose Uniface. You did not expect that, did you! To be honest it was a close call. Right on time Uniface invited the management for a lab visit in Amsterdam. Uniface product management listened and that did some amazing magic.

But software development isn’t about magic. No fairy tale with software generating magicians. We all know that. It’s just hard work. One of the most heard complaints is the lack of standard components or add-ons in Uniface. The management of the mentioned organisation also asked this to the Uniface product management. Why do we need to build everything by our self? Why can’t we download standard solutions instead of building them?

The answer is simple: just because…

  1. Your problem is unique, no one ever had it before
  2. It’s been built, but the solution is too specific
  3. Or the solution is built in a previous Uniface version (what the f…, Uniface is upward compatible!)
  4. Or the quality is poor, there is no documentation, there is no source code available or someone wants money for it (and you believe software should be free)
  5. Someone built it before, but did not share it with you.

Is this a problem? Yes, it is. Can we fix it? Yes, we can. And I believe it’s simple. Whenever you think ‘Hey, why can’t I just find this on the web?’, do the following:

  1. Look once again, perhaps it is somewhere around
  2. Design the most generic solution
  3. Build it
  4. Test it
  5. Write some documentation
  6. And…. share it.

Maybe it’s a good New Year’s resolution. Emphasize your Uniface seniority and build to share. How? Where? Who? After reading all of the reactions on my previous posts I have a plan. I am working on it and I’ll explain it to you in the next posting.

Happy new year!!!!

Make some noise!

In my previous blog post I told you about my worries. I was thinking about it and even talked to a few of you about it. It reminded me of something that happened to me once. A few years ago I was hired by an organisation. I was just one of the Uniface pro’s. Besides Uniface they used another development platform. I witnessed something very interesting, let me share this with you.

Both disciplines had their own room. In one room all went well, a dozen men worked in silence, behind a closed door they achieved their goals on time and within budget. The applications they maintained were very stable and performed as expected. The other room on the other hand was very lively, the walls were filled with all kinds of merchandise. The young developers had all kinds of technical issues, played arcade games in their breaks and drank beer after work.

Can you guess in which room the Uniface developers worked? Easy one, I know. If you can guess the next answer, I’ll buy you a beer. Which platform was preferred by the management?

I am afraid this is going to cost me a fortune on beer. We all know the answer. Of course, the other guys did a great job. I am, like most of us, too negative about them and the tooling they use. The reason they were not that productive was caused by the tools they used. But did they win?

Change the point of view. Let’s say you are the management of a company. The company depends completely on a few Uniface applications. Very stable and low on maintenance costs. In the near future you expect major changes in the organisations strategy and the markets are changing rapidly. You need to invest in new applications and/or change the existing ones. Are you going to use Uniface or go for something completely new? Choosing Uniface is the rational choice, isn’t it. Imagine, you have all these experienced guys (sorry ladies, but this is a man’s world…). But you never hear them. Sometimes you wonder if they even exist! How do you know if they use modern techniques? And what if you need a dozen more of these pro’s? Where and how can you find them? When you consult google.com you’ll find all kinds of software warehouses to deliver you support on that other tool, while on Uniface all you find in the top 10 is Uniface itself.

If I had to give advice to this management, my advice would be to choose this other tool. Regardless which tool. Being a Uniface developer, as I am, I can tell you this hurts a lot. But it’s just a rational thing. Or isn’t it?

This reminds me. Once in a small village in The Netherlands the only shop closed down. All inhabitants did their grocery in the large supermarket in the adjacent city. Quiet normal, I guess you see this everywhere in the world. The next day an alderman announced in the newspaper that it would be a good idea to not only close the small shop, but also close the complete village. If the inhabitants loved the city to do their grocery, why not go and live there. This action did not save the local shop. But what if this one guy achieved to create a kind of movement. Let’s say, he achieved to motivate some entrepreneurial people. With this small group they could create new business for the local store. Instead of competing with the large competitor, focusing on the strengths. Sometimes you need the help of a community. Today, the strength is the community!

All successful tools I know have communities. Some very successful tools even are created by the community! A product community can be a partner or a critic ally for the company, but always fight on the same side. But, where is the Uniface community? All I see is a great product and a website (uniface.info) with lots of fans. But that is not a community! It is something created by Uniface. I want to create a real Uniface community.  I truly believe we have the strength to unite and make the difference!

You can either participate or wait behind a closed door and I believe I can hear some melancholic seventies music. Let’s make some noise…. Let the world know we are here…. In my next blog I will share my ideas and plans with you all. Do you have idea’s? Please contact me  🙂

Uniface 10: The new procedural declaration of component variables

For Uniface 10 we are constantly reviewing and redefining old concepts, aiming for consistency and reusability while looking for new ways to improve your developing experience and enforce good development practices. This is what the new procedural declaration of component variables is all about.

If you are a developer coming from older Uniface versions you probably are familiar with the ‘Define Component Variable’ form, that allows the creation of variables with component scope and an optional display format. You certainly also know how to declare local variables using the variables block in your triggers and modules. In that case, you might have wondered while accessing the ‘Go To -> Component Variables…‘ menu, selecting the data type from a dropdown list, entering a display format and filling a couple of optional fields… Why can’t I do this from my code, like with local variables?

There are some advantages in the form approach, but the truth is that variables declaration is a fundamental part of coding, as it is the concept of variables scope. It is not only logical but even expected for new developers that variable definitions at component level have component scope. Furthermore, is it a more efficient method of defining and inspect variables. If you think that way, congratulations: You got it! If you are not convinced yet, please keep reading.

In version 10 (10.1.03 and higher) component variables are declared using the ‘variables’ block in the Declarations container of a component. You may declare as many blocks as you want, taking in account that variable redefinitions are not allowed by the compiler. The display format definition takes place -optionally- in the declaration itself, so it looks like this:


variables

DataType {DisplayFormat} VariableName {, VariableName2 ... {, VariableNameN}}

endvariables

The display format is defined using the ‘DIS(<format>)‘ syntax, as it used to be in the ‘Define Component Variable‘ form. You can find extensive documentation about display formats in the Uniface Library. As for the missing fields ‘Description‘ and ‘Comments‘… Well, nothing better than in-code comments to describe our variables.

An actual example of component variables block could be:


variables

string                         vCity, vCountry

string DIS(Mr./Ms. ??????????) vFormattedName         ;- Formatted name for official notifications

date   DIS($NLS(MEDIUM,DATE))  vStartDate, vEndDate   ;- Start/End of contract

float  DIS(9999999P99 US$)     vSalary                ;- Net salary in US dollars

endvariables

Simple, isn’t it? But here is the best part: since component variables are declared procedurally, you can use all the precompiler directives to generate, influence and include component variable declarations. Move your variables block to an include proc to make it reusable. Use the #for directive to quickly generate variables. Make use of definitions to avoid typing complex display formats and ensure consistency between components. Create a snippet library with display formats to quickly insert them into your code.


variables

;- Predefined variable declaration for error handling:

#include MYLIB::ERROR_VARS                 

#for CPTVAR in (NAME,SURNAME,CITY,COUNTRY)

string v<CPTVAR>                      ;- Generate component variables for customer data

#endfor

string <IBAN_FORMAT> vAccount           ;- Predefined printed format for IBAN code (IBAN ???? ???? ???? ???? ????)

endvariables

If you are still hesitant don´t despair: We keep working on great ideas to make code editing faster and easier, as well as providing code and compiled objects information on the editors. But more about that in another blog post…

In the meantime, leave us a comment with your thoughts about the new system! What do you like? What can be improved? How would you make the best use out of it?

Loading loads of Glyphs

As a software developer, every once in a while you find yourself performing a tedious manual task for some hours. As it seems to be something you need to do only once, it does not seem to be worth automating the task. But then later it turns out that you have to do it again. So you make a quick and dirty tool. And then later a colleague has to do the same thing and asks if you have an efficient way of doing it. So you make your tool a bit nicer so people other than you can use it.

For me this happened for the task “load a very large number of image files into Uniface Glyphs”.

So here I present you my tool.

It allows you to select a folder on your disk, then it presents you all the files that are in the folder. You select the files you want to convert and press the button. Occurrences are created in the Uniface Glyph table. Files in an unsupported format are marked yellow, Glyph names and descriptions that are too long are also marked in yellow. Make your changes and press the next button and all your Glyphs are stored and compiled.

Now we can perform a task that used to take hours in a few minutes. (Admittedly you don’t have to do this very often but it is really boring task when you do need to do it!)

The attached Uniface export is for Uniface 9.7. With some adjustments it should also work with older Uniface 9 versions. You need to have a DICT model in your repository (have umeta.xml imported).

http://unifaceinfo.com/download/6470/

Disclaimer:

This tool is not part of the Uniface product and therefore not in support. It also uses some code that is not officially supported and that is subject to change without notice. Please feel free to change the tool to your own requirements.

Glyphmaster

NB:
Have a look at what I did around the selection of the folder:

  • You can either type the name,
  • Or select it from a dialog when you press the button,
  • or select it from your history using the dropdown.