Bad language must be punished

It’s time to get tough on the jive-talking jargonistas and lecture-circuit logopaths who persist in ****ing up the Queen’s (or President’s) English.

Renditionable words and phrases listed below.


Cute the first time, but not any more

goodness: when used in techy contexts, as in ‘filled with API goodness’ or ‘pure XSLT goodness’

love: as in ‘we’re loving the new desktop’, or ‘that kitten meme is getting a whole lotta love down here in W1’, or ‘get a little API loveliness’

stuff: as in ‘cool stuff for your iPad’

-ista: as in Pythonista, Cameronista, standardista, jargonista (as used earlier in this post…)

play space, sand pit: as in ‘this is the project play space, this is the sand pit’

Down with the subculture

Any phrase like ‘down with my homies!’ or ‘epic fail!’, uttered by people who should know better: sometimes executives, sometimes after consuming stimulants, sometimes even with hand gestures. ‘Totes amazeballs’ is really bad.

Tough-talking Americanisms

barn storming

big ask: especially as an adjective, as in ‘That’s a big-ask programme for a young pianist!’

boil the ocean

chops: as in ‘Steve Jobs didn’t have the chops to stick it with NeXT’

deep pocketed

hella (Californian for ‘very’): painful when used by non-Californians

spin up: as in ‘once we spin up the project’

tie the bow: as in ‘once Google tie the bow on desktop integration’

No idea what these mean, but I don’t like them

agile

bootstrapping

buckets: as in ‘vertical cost buckets’

burndown: as in ‘can someone give me a sprint burndown’

business logic

cadence (in an ‘agile’ project management context)

captured all the givens

convergence in terms of delivery

decisioning

ensemble of features

meme

skinnable

suite: as in ‘suite of applications’ or ‘suite of resources’

tech spikes

thought leaders

tick all our boxes

turnkey

user journeys

value: as in ‘we believe that Adobe is uniquely able to bring new value to the setting’

viral email

walled garden

wind: as in ‘there is a strong following wind behind the drive to open adoption’

workstreams

New ways to patronise

helpful: as in ‘that’s not a very helpful remark’

confusion and misunderstanding: as in ‘there’s been a great deal of confusion and misunderstanding about the party’s policy in Iraq’

‘That’s a very good question!’: as in ‘I’m not going to give you an answer.’

… and these are still bad

adjectives as nouns, even worse with an adverb: ‘We took everything good about the platform, and added a dollop of unbelievably great!’, ‘Your new app is just a whole lotta awesome!’

around: as in ‘issues around resourcing’ (i.e. problems with staff); a tertiary-educated alternative to the prosaic ‘about’ or ‘with’

conversation: as in ‘this is a conversation we need to have with the licence fee payer…’, or ‘The Role of Strategic Conversations with Stakeholders in the Formation of Corporate Social Responsibility Strategy’

issues: see around. (It’s pointless to whine when language morphs in ways we don’t like, but ‘issue’ did used to be useful, as in ‘a number of complex issues’. Now the word is just a posh or euphemistic replacement for ‘problem’, which is regarded as harsh, almost rude. Similarly, when I was growing up in Australia, the good word ‘got’ was declared non-U, or even taboo: we were taught to say ‘received a letter’ not ‘got a letter’. An English professor told me that in one school, a teacher took his class outside and made them dig a big hole, then they each wrote the word ‘got’ on a piece of paper and buried it.)

offering: as in ‘Channel 4’s VoD offering’ or ‘the Salesforce CMS offering’, for some reason much loved by IT managers

refresh: as in ‘business refresh’ (initiate a round of redundancies…) or ‘technology refresh’ (…then buy iPads for all the VPs)

relevant and interesting: as in ‘get the data on a map, then find ways to make it relevant and interesting’, aka get the cart before the horse

vertical and horizontal: as in ‘a horizontal slice across a vertical market’

Posted in language | Tagged | Leave a comment

Snowpersons of Balham

Posted in Balham, Snow, Snowman, Uncategorized | 2 Comments

20 ways to debug Qt signals and slots

Below are some suggestions for troubleshooting signals and slots in the Qt C++ library.

1. Check for compiler warnings about non-existent signals and/or slots.

2. Use break points or qDebug to check that signal and slot code is definitely reached:
– the connect statement
– code where the signal is fired
– the slot code.

3. Check that the parameter types of the signal and slot are exactly correct and, as appropriate, that they match.

4. Make sure you haven’t added a name to the signal or slot argument: for example, use textChanged(const QString &) not textChanged(const QString &text).

5. Check that the connect argument types and syntax are correct. The connect statement should look like this:

connect(senderObject, SIGNAL(mySignal(const QString&)), receiverObject, SLOT(mySlot(const QString&)));

Check brackets, check that SIGNAL and SLOT are capitalised and that the sender and receiver are both objects, not class names.

6. Check that the signal is being fired as expected. You can do this with code like the following:
connect(this, SIGNAL(mySignal()), qApp, SLOT(aboutQt()));

7. Check that slots are declared correctly in the appropriate public/protected/private slots sections of your class declaration. Check that you’ve used private slots:, for example not slots:. Check for a colon, i.e. private slots: not private slots.

8. If you use custom signals, check that these are declared correctly, with a void return type, in the public/protected/private signals section of your class declaration.

9. Make sure the Q_OBJECT macro is inserted at the beginning of your class declaration.

10. Check that classes using signals and slots inherit QObject or a QObject subclass.

11. Make sure to run qmake after adding the Q_OBJECT macro to a class. You may need to rebuild your project.

12. Use break points or qDebug to check that slots are being called the appropriate number of times: make sure the connection isn’t made repeatedly.

13. Put all connect statements before functions calls that may fire their signals, to ensure that the connections are made before the signals are fired. For example:

   _myObj = new MyClass();
   connect(_myObj, SIGNAL(somethingHappend()), SLOT(doSomething()));
   _myObj->init();

not

   _myObj = new MyClass();
   _myObj->init();
   connect(_myObj, SIGNAL(somethingHappend()), SLOT(doSomething()));

14. Check that your connections aren’t affected by disconnect statements.

15. Don’t add a semi-colon after Q_OBJECT:

   {
   Q_OBJECT
   ...
   }

not

   {
   Q_OBJECT;
   ... 
   }

16. Check the return value of the connect statement: connect returns true if it successfully connects the signal to the slot.

17. Use QErrorMessage::qtHandler() or qInstallMsgHandler() to view connect error warnings.

18. Make sure that your slot function is declared as a slot, e.g. private slots not private.

19. Use QSignalSpy to verify signal arguments.

20. Follow Qt’s naming conventions for signals and slots:

signal: somethingHappened()
slot: doSomething()

In grammatical terms, signal names are usually constructed from a past participle: changed, pressed, etc. They describe an event or change of state that has occurred. Slot names are imperative verbs and describe an action to be done: clear, setDate, etc.

Posted in Uncategorized | Tagged , , , | 44 Comments

Worse than slow

Computers used to be slow*.

Now they’re unresponsive. 

Computer boffins have a word for it: latency. This is the delay between doing something (clicking the Submit button) and getting a response (‘Thanks for your order’).

Latency can interrupt your flow of thought. Did I click the button? Is that link broken or did I just not click it properly?

Latency can wreck your day.  You press the Submit button twice (because it didn’t seem to work the first time) and your comment is posted twice, or you wind up with two sets of tickets to the same event. This can cause real problems for computer engineers: people press Submit buttons again and again and again, each time sending a new request to the website computer, thereby creating a lot more load than anticipated.

Mobile devices are worse, even at the top end: browsing the Web on a Blackberry or Nokia N95 can be soul destroying.

People often complain that their computer is ‘getting slow’. What they mean is that latency is getting worse. Usually this is either because they got viruses from dodgy websites, or they installed one or more virus checkers and ticked lots of options. An excess of anti-virus software can feel a lot like a virus.

This is where software like Firefox 3 and Google Chrome is getting it right. You click on a New Tab icon and a new browser tab appears. Press the Close icon (the X at the top right of the window) and the application window closes. No delay! Not like some browsers…

Best of all will be the ‘instant on’ operating systems like Splashtop, which start up in seconds and have browser software built in. 

The death of latency will make the world a happier place.


* And if you think slow means 56K, spare a thought for how it was in the olden days. In 1974 at Eudunda Area School in rural South Australia, we marked up computer punchcards with a pencil, eight characters per card, put the cards together with a rubber band and gave them to the teacher — who then, hopefully, parcelled up the cards, took the parcel to the post office, and sent it to a computer centre in Adelaide. There the cards would sit until some charitable person granted them processing time. Two weeks later a huge bag of gatefold printout would be returned to the teacher. Then you’d discover you’d marked up the wrong character in one column, or got the order of cards wrong, or — if you were lucky — just made a syntax error. Then the whole process would begin again… Hello World took me three months.
Posted in Google Chrome, Usability, Windows | Tagged , , , , | 1 Comment

Chrome is quite good

Highly scientific tests show Google Chrome to be a bit faster than Firefox and a lot faster than Internet Explorer.

Code mostly from WebKit and Mozilla, but hey…

Eventually I guess Chrome will be built in to ‘instant-on’ operating systems like Splashtop.

Maximised it looks like a desktop, with the blue colouring and tabs-on-top, like Google are expecting us to live there full time. Chrome gives Google a lot more scope to develop web applications and sooner or later I guess they’ll release a Chrome-only application. Assuming Google’s plan for world domination works out, Chrome will then become like a ‘runtime environment’.

Then in five years someone will have the bright idea of standalone applications that don’t need to run in a browser!

…and I love the euphemistically named ‘incognito mode’, presumably aimed at undercover freedom fighters. They’re all at it: IE8 has InPrivate, Safari has Private Browsing, Firefox has some other thing…

Posted in Google Chrome | Tagged , | 1 Comment

Great Interface Mysteries #1: unresizable dialog boxes

Lots of dialog boxes in Windows that should be resizable, aren’t.

This is very annoying and completely unneccesary: it’s simple to write the code so dialogs are resizable.

How can this be so after decades of Windows development?

This is one of the world’s Great Interface Mysteries.

Unresizable Windows dialog

Here’s the dialog box that pops up when you edit environment variables in Windows.

The box isn’t resizable so you can’t see all the text without copying it and pasting it somewhere else.

D’oh!

Below is the same but different.

I’d like to be able to see all the commands containing the word show, but I can’t because the box isn’t resizable.

Double d’oh!

The Options dialog in Visual Studio, with Keyboard selected

 

 

 

 

Posted in Uncategorized, Usability, Visual Studio, Windows, Windows XP | Tagged , , , , | 1 Comment

Why is Find & Replace so hard?

The Visual Studio 2005 Find/Replace dialog boxWhat is it about Find & Replace?

Noone seems to get it right.

Visual Studio 2005 is one of the worst culprits.

I guess the main problem is that as with so much Microsoft stuff, they seem caught between catering for beginner and expert – and wind up getting it wrong for both.

1. The box pops up the ‘9 occurrence(s) replaced.’ message in an oversized, separate window – but if you uncheck ‘Always show this message’, the confirmation message is displayed (miles away) on the window frame.

2. Those rather puzzling right-pointing buttons next to the text entry fields are disabled unless you use regular expressions or wildcards – but there’s no way to know that unless you’ve ticked the relevant box, which is hidden.

3. What the hell is ‘Quick Replace’ as opposed to ‘Replace’? Who cares?

4. There are effectively four dialog boxes in total: Quick Find, Quick Replace, Find in Files, Replace in Files. There could easily be just two, or even one.

5. Find & Replace in the HomeSite editor has a wonderful, simple feature: multi-line text fields. You can put line breaks in the find or replace text without scary stuff like regular expressions.

6. Anyway – pop-up boxes are annoying and slow – why not have a simple Find area in the window frame, as in Firefox?

Posted in IDE, Visual Studio | Leave a comment

Python is (not) better than C++

Python is great.

I love it: numbers of arbitrary precision, dictionary keys of any type, easy file reading, stuff like random.sample(xrange(1000), 10)…

Fantastic!

But…   Python is being sold for the wrong reasons.

In particular, Python is (of all the languages in all the towns…) compared to C: the archetypal boring, old fashioned and difficult language.  I have a hunch that most of this comes from Python evangelists who endured a grim semester of C but never went on to use C — or rather C++ — in real life.

In reality, different languages are not as different as some people make out.

With Python, you don’t have to worry about memory

Well — sort of. Except that you *do* have to worry about memory, as with any language. Objects take memory. Worry about it.

The difficulties of memory handling in C/C++ are over-rated:
1. Noone uses malloc() and free any more, unless they’re making a mistake or doing something strange or hardcore — in which case they probably know what they’re doing.
2. Most (or many) C/C++ objects are (or should be) allocated on the stack, in the scope of a function — in practice, this works quite like garbage collection in other languages.
3. Lots of C++ code is written using toolkits like Qt, which allocate and free memory for objects and their children created on the heap (i.e. with new) without leaks.

Dynamically typed languages are easier

Really?

They’re easier because you don’t have to type in those pesky words like int and double.

…but they’re harder if you’re trying to work out what the hell a long and complex method actually returns, or takes as an argument.

So — a little bit yes, a little bit no.

Python is flexible

Because typing is dynamic? Since when did you need myVar to be ‘spam’ one minute and 42 the next?

Python is terse

So what?

Did you ever look at a piece of old code and say ‘This is wonderfully terse!’

Far better to understand code than admire it.

Python is fun!

This is sort of true.

You get much more ‘bang for your buck’ in the first five minutes of learning Python than for lower-level languages: open(‘myfile’).read() can be pretty exciting if you’re used to file handling in C.

But once you’re up and running, the ‘niceness’ of a language doesn’t really matter. In fact, I sometimes think it doesn’t really matter what language you use: all that matters is how well you know the language and how well you use it.

Self is good, self is explicit

To me this is mystifying.

I think, again, it stems from developers trained academically in C, but unused to actually working with C++. Personally, I’d go nuts if I had to type in self every time I coded in C++. The idea that the self keyword removes ambiguity is… daft. To me, the C _private idiom is a much better alternative to avoid name clashes — and only unusual or very stupid C code has variables at global scope.
To my mind, self is just clutter — and as the first parameter of every method it’s annoying and confusing.

So there.

Python has loads of useful built-in types

Bring on the nasty null-terminated C character strings… Yuk. What a pain. Python strings are so easy! But who in their right minds (with some obvious hardcore caveats) uses C strings?

It seems that certain Pythonistas have never used the C++ Standard Library, let alone Boost or Qt or any of the other toolkits that are a normal part of C++ coding.

Python is instant: no need to compile!

Well… sort of.

Except that still have to wait for source code to be compiled into byte code.

In reality, recompiling a C++ program (if you haven’t changed header files, and/or you’ve structured it well) is not much slower than running the Python interpreter on a Python program.  My Pentium 4 running Visual Studio usually takes 5-30 seconds to recompile and run my (Qt GUI) app in debug mode. Even recompiling the whole program (25,000 lines or so) takes no more than a minute or two.

Bad C/C++ programs have lots of inter-dependencies that make recompilation slow. Good code uses class decoupling and techniques like the PIMPL idiom to keep compilation fast, no matter how large the program.

In the end, it comes down to good code design: sensible idioms, pattern usage, and all the rest. Same for Python, C, C++ and every other language.

 

Posted in c++, Python | Tagged , | 24 Comments