środa, listopada 17, 2010

Myśl dnia

Robienie wydmuszek interfejsu jest jak umawianie się na randki z transseksualistami - wszystko jest w porządku dopóki nie zaczniesz klikać.

ActivityIndicator & TextInput - interactive search field

In asynchronous world there is often a need to show user, that application is doing something in the background, and it is not hang. When we can determine amount of time needed to perform some action, we should use ProgressBar controll, when there is no such possibility we should use ActivityIndicator.

ActivityIndictator class does not have many usefull functions,  the most interesting function one is animate(doAnimate:boolean). It starts (or stops) animation of indicator, this is used to produce impression that application is working on something.

We will create simple search field with appriopriate icon and indicator. Let's start from TextInput:

with(textInput) {
   x = 50;
   y = 50;
   width = 200;
   
   leftIcon = searchImage;
   leftIconMode = TextInputIconMode.ALWAYS;
   rightIcon = activityIndicator;
   rightIconMode = TextInputIconMode.NEVER;                
}
 
We are using here the most usefull feature of TextInput control: left and right icon. These icons are inserted in the text input and does not hide text inserted. The only limitation (maybe bug) is that the right icon is not correctly showed when clear icon is present (they are in the same position). That's why we are showing search button on left side of the controll. Above code will result in creation of this piece of interface:
TextInput with clear and search icons
When user press the search icon, we should start animation and start doing background operations.

protected function startSearch(event:Event) : void 
{
    //disable search box and start animation
    textInput.enabled = false;
    textInput.rightIconMode = TextInputIconMode.ALWAYS;
    textInput.leftIconMode = TextInputIconMode.NEVER;
    activityIndicator.animate(true);

    //start background job
    setTimeout(stopSearch, 5000, textInput.text);

    //visual improvement
    textInput.text = "Searching...";
    resultLabel.text = "";
}
We are hiding search icon, show and start animation, and do some background operations - here it is simulated by few seconds of delay before the results will be displayed.
TextInput with ActivityIndicator
Field is disabled, so user cannot change inserted text additonally we may change background of disabled controll by changing it's skin. When background job is finished, we should enable it for user input:

protected function stopSearch(text:String):void
{
   //display results
   resultLabel.text = "Sorry, nothing has been found for \"" + text + "\".";
   textInput.text = "";

   //enable search box for user
   textInput.enabled = true;
   textInput.rightIconMode = TextInputIconMode.NEVER;
   textInput.leftIconMode = TextInputIconMode.ALWAYS;
   activityIndicator.animate(false);
}

ActivityIndicator animation can be changed by skin, with it we are able to create consistent activitiy indication in whole application. TextInput icons placeholders can be used in many ways, for validation indication, type hinting, help and many other non crutial items. Inserting them in text input box will keep interface small and clear.

czwartek, listopada 04, 2010

Czeladnika do zawodu programisty przyuczę

O tym, że uczelnie techniczne w Polsce oderwane są od rzeczywistości wiadomo od dawna. Skostniałe kumoterskie układy, narzędzia i technologie pamiętające czasy króla Ćwieczka, program nauczania dostosowany do posiadanych naukowców zamiast do wymaganej na rynku pracy wiedzy. Doskonałym przykładem tej patologii są studia informatyczne - programistyczne. Studenci marnują swoje żywota starając się zrozumieć algorytmikę opartą o grafy, całkując oraz wykonując modele cyfrowych zapalników.
Patrząc z perspektywy mojego kilkuletniego doświadczenia, wiedza ta (pomimo tego, że ciekawa) nigdy nie była przeze mnie użyta. Ileż w końcu jest aplikacji w których można to zastosować? Jedna lub dwie i one są już napisane i używane. Nikt nie poszukuje kolejnego systemu przetwarzania audio, jest kilka płatnych, kilka darmowych, a używane są co najwyżej do wycinania kawałków dźwięków na dzwonki do komórek (jeśli aż tyle).
Zdarzało mi się pracować, ze świeżo upieczonymi studentami, zdarzało mi się też pracować z doświadczonymi pracownikami pozbawionymi podstawowej wiedzy. Metoda prowadzenia zajęć z programowania w językach wysokiego poziomu wypełnia studentów fałszywym przeczuciem, że problemy z którymi się borykają są nowe i całkowicie unikatowe. Nikt nie stara się nawet poruszać kwestii wbudowanych w kompilator albo system operacyjny bibliotek - nauka oparta jest o rozwiązywanie znanych i starych problemów. Przykładem zagadnienia gdzie ta metodologia przynosi największe straty to operacje na napisach (ciągach liter) - prześledźmy to  na przykładzie bardzo popularnej biblioteki strings (albo array) w porównaniu do najpopularniejszych problemów. Podstawą jest długość napisu (to wie każdy, bo każdy to widział), podmiana jednego ciągu na inny (tu już kusi wymyślić koło na nowo), złączenie tablicy w napis przy pomocy jakiegoś separatora (np. przecinka) - tutaj już pełna samowolka, o takich rzeczach jak uzupełnianie znakiem do długości, zamiana małych na duże litery, policzenie słów i tak dalej. Tysiące programistów na świecie opracowuje właśnie własne procedury, do rozwiązywania takiego typu problemów, nikomu nie przyjdzie do głowy sprawdzić czy, a nóż-widelec, ktoś to zrobił wcześniej, może nawet (o zgrozo!) jest to wbudowane w kompilator.
Jeśli absolwent ma szczęście trafić zaraz po studiach do środowiska które w dość szybki (a często i brutalny) sposób uświadomi mu jego braki oraz niedociągnięcia - jeśli tego szczęścia nie ma, trafi do firmy wypełnionej takimi samymi jak on, grupowo będą legitymizować swoje błędy tracąc czas oraz pieniądze inwestora na odtwarzanie dawno zoptymalizowanych i rozwiązanych problemów - tylko dlatego, że wszyscy uczestnicy tej gry pozbawieni zostali praktycznej wiedzy, którą miał im dostarczyć uniwersytet. Uniwersytet wypełniony teoretykami nie ma zaś możliwości przekazania studentom wiedzy praktycznej, gdyż najzwyczajniej jej nie posiada. Programowanie  można porównać do produkcji skrzypiec: można spędzić kilka ładnych lat ucząc się zjawiska rezonansów, wyliczając idealne grubości oraz długości strun, poznając historię ludwisarskiego fachu. Czy może to skutkować tym, że tak wyedukowany człowiek wyprodukuje dobre skrzypce? Nie, w żadnym wypadku, najwyżej będzie to pudełko ze sznurkami. By móc rzeźbić w czymkolwiek, trzeba ten materiał poczuć, drewno musi leżeć w dłoni, trzeba poznać jego twardość plastykę i zachowanie pod uciskiem, trzeba wielu lat praktyki aby produkować dobre skrzypce, jednak nikt nie wpada na pomysł studiowania tego, gdyż wiedza taka byłaby zupełnie zbyteczna i płacenie za takie studia to całkowity idiotyzm.
W dzisiejszych czasach prawie całkowicie zaniknął proces przyuczania do zawodu w praktyce. Nie było szkół dla kowali, szewców, ludwisarzy czy też piekarzy - czeladnik pomagając przy pracy, patrząc na ręce nabierał wiedzy, tak by w końcu sam mógł uczyć. Czemu nikt nie prowadzi czeladniczych praktyk programistycznych? Komitywa firm z uczelniami mogłaby skutkować produkcją studentów, którzy po wyjściu z uczelni byliby już zaznajomieni z rynkiem, zżyci z jego oczekiwaniami i przystosowani do nauki przez praktykę, nie baliby się przy tym nauki nowych rzeczy, byłby to naturalny sposób dla nich na rozwijanie swoich umiejętności. Firmy w takim układzie miałyby ewidentny zysk - filtrację najlepszych oraz ewidentny wpływ na to w jakim kierunku szkoleni są studenci, uczelnie wzbogaciłyby znacząco swoją ofertę edukacyjną, takie studia nie byłyby tanie, jednakże ich unikatowy charakter gwarantowałby praktycznie zatrudnienie w branży po ukończeniu. Ścisła współpraca doprawiłaby majonez teorii szczyptą (albo i garścią) pieprzu praktyki - tak potrzebnej w tym dość specyficznym zawodzie.