Hahó, lányok, programozni menő!

Éljen a feminizmus!
Ja, hogy ez lényegében csak Prezi reklám? Akkor nem szóltam.

Coding girls néven indított kampányt a Prezi azért, hogy bebizonyítsa, az informatika nem csak a fiúk játszótere. Nyolc kiválasztott tanulhat náluk.

Őszintén szólva egyre inkább kezdem már unni ezt a nagy programozás-hypeolást. Azt hallom, hogy általános iskolában akarják már valahol tanítani, most a női nemet hiányolják a szakmából...mi jön ezután?
Olyan, mintha a városiaknak tanítanának mezőgazdasági ismereteket - hogy hogyan kell szántani, vetni, aratni - megint egy plusz lexikális tudás, amire semmi szükségük nincs.
Meg már bocsánat, ha irigy vagyok, de mi szükség van arra, hogy egyre több és több vérpistike legyen, akik programozónak mondják magukat? Mi szükség van arra, hogy híguljon a szakma...?
Jaa, ezt a cégek már nem érik fel ésszel? Én kérek elnézést.

Ja, és most a nőket akarják rávenni a programozásra. Na, vajon miért nincsenek női programozók? Azért, amiért nincsenek női traktorosok sem. Vagy buszsofőrök. Már nem újkeletű a dolog. A történelemórákon röhögünk, hogy annó a nagy egyenjogúság zászlaja alatt tettek olyan pozícióba nőket, ami teljességgel abszurd volt. Most is ugyanez folyik, csak burkoltabban.

De oké, részemről tanulják csak a gyerekek vagy a totális laikusok a programozást - csak az a baj, hogy jó eséllyel x évet el fognak vesztegetni tévúton az életükből, mert nem maguk találtak rá a szakmára (mint itt szerintem sokan), hanem beletessékelték őket. Mert ez most a menő. A programozók a jelen kor rocksztárjai... az...

Hozzászólások

Azzal nincs gond, hogy marketingelik egy kicsit, tényleg sokaknak még mindig mondjuk egy Stallman külső ugrik be a programozó szó hallatán, hogy ennyire széles körben csinálják, már problémásabb. Mert tényleg kell egyfajta analítikus gondolkodásmód a hatékony problémamegoldáshoz és így a programozáshoz.

BlackY

"Na, vajon miért nincsenek női programozók?"

Vannak. Sőt, még szépek is vannak :)

A prezinel ennyire nem tudnak csajozni a programozok?:) Burkoltan (meg programozni se kell tudni) viszik a csajokat hazhoz:D

// Happy debugging, suckers
#define true (rand() > 10)

"Meg már bocsánat, ha irigy vagyok, de mi szükség van arra, hogy egyre több és több vérpistike legyen, akik programozónak mondják magukat? Mi szükség van arra, hogy híguljon a szakma...? "

Az a helyzet, hogy hatalmas hiany van programozobol a vilagon.
Az USA-ban a kovetkezo 10 evben kb. 1 millio olyan IT allashely lesz, amit nem tudnak majd betolteni.
Ezt pedig csak oktatassal, nepszerusitessel lehet megoldani.

"megint egy plusz lexikális tudás, amire semmi szükségük nincs"

A programozás sokkal inkább problémamegoldás, ami egy készség, nem lexikai tudás. Ugyanazt az eredményt lehetne elérni matematikai vagy fizikai feladatok megoldásával, csak az nem annyira látványos. A lexikai tudás kimerül az adott programozási nyelv szintaxisában és standard függvényeiben, ami azért nem olyan sok.

"Meg már bocsánat, ha irigy vagyok, de mi szükség van arra, hogy egyre több és több vérpistike legyen, akik programozónak mondják magukat? Mi szükség van arra, hogy híguljon a szakma...?"

Nem ez a cél. A cél az, hogy felfedezzék a tehetségeseket. Ha valamit soha nem próbálsz ki, honnan tudod, hogy abban nem vagy tehetséges? Miután pedig rájössz, hogy abban tehetséges vagy, lehet, hogy azt választod hivatásodul is.

"Ja, és most a nőket akarják rávenni a programozásra. Na, vajon miért nincsenek női programozók? Azért, amiért nincsenek női traktorosok sem. Vagy buszsofőrök. Már nem újkeletű a dolog. A történelemórákon röhögünk, hogy annó a nagy egyenjogúság zászlaja alatt tettek olyan pozícióba nőket, ami teljességgel abszurd volt. Most is ugyanez folyik, csak burkoltabban."

Vannak. :) Attól, hogy jóval kevesebb nő fogékony a programozás iránt, mint férfi, még nem kell őket kizárni a szakmából. A természetellenes az lenne, ha az arányukat akarnák mesterségesen beállítani (a parlamentben divat ez mostanában), azzal semmi baj nincs, ha kicsit ösztönzik őket.

Az utolso bekezdesre: Ha jol tudom, most sincsenek kizarva a nok a programozasbol.
Annak pedig szerintem sokan orulunk, hogy igeny mutatkozik meg tobb programozora. De akkor miert nem arrol szol a kampany, hogy a prezi grundol maganak 8 fiatalt es mondjuk Coding Teens programban megtanitja oket programozni.
Szerintem a jelenlegi kampany inkabb szexista semmint feminista, ami nem baj, csak jeleztem. :)

Vannak női programozók. Biztosan boldogok lesznek, ha ilyet látnak. Ők kitanulták a szakmát, másokat meg mindenféle cégekbe betolnak pusztán azért, mert p*nájuk van.
Végülis ezzel pont őket alázzák meg...

-------------
"Mérnökkel vitatkozni olyan, mint disznóval birkózni a sárban - kis idő múlva rájössz: Ő ezt élvezi..."
Winben blogja

"Az utolso bekezdesre: Ha jol tudom, most sincsenek kizarva a nok a programozasbol."

Nem is állítottam ilyet, ezt winden gondolataiból olvastam ki.

"Szerintem a jelenlegi kampany inkabb szexista semmint feminista, ami nem baj, csak jeleztem. :)"

Nem is a kormányra gondoltam. :) A jelenlegi ellenzék szokta időnként hangoztatni a női kvótát.

"In 1984, 37.1% of Computer Science degrees were awarded to women..." "...less than 12% of Computer Science bachelor's degrees were awarded to women at US PhD-granting institutions in 2010-11." (Wikipedia)

A másik meg, hogy mindig ezt az ilyen-olyan gondolkodásmód kell a programozáshoz dolgot hallom, azt soha sem, hogy milyen jó lenne, ha friss ötleteket, szemléletmódot hozna valaki. Pedig erre – az itt és máshol tapasztaltak alapján – nálatok is szükség van, ha nem csak a prímszámok keresgélésére és ilyesmikre (amik nyilván fontosak, de megvan a maguk helye) szeretnétek használni a tudásotokat, hanem sikeres termékek előállítására és eladására.

--
"Trollhammaren sveper igen..."

Nem csak nagyvállalatok vannak a világon, bár tudom, hogy Magyarországon mindenki multinál szeretne dolgozni. Előfordulhat az is, hogy ugyanannak az embernek kell kitalálnia, megcsinálnia és eladnia valamit.

Egyébként nem azt mondtam, hogy nem kell, hanem azt, hogy itt sem árt, ha valaki új szemléletmódot hoz. Nem elsősorban arra gondolok, hogy konkrétan a kódszinten mit hogyan kell megoldani, de egy felhasználóknak szánt alkalmazás például nem csak a csodaszép kódból áll. A másik meg az, hogy vajon a nyolcvanas évek elejének Amerikájában nem kellett „az egyfajta gondolkodásmód” a programozáshoz? Vagy azóta ez így kiveszett a nőkből? Vagy ez így hogy?

Magyarországon szerintem tényleg szükség van ilyesmire, mert az áthatolhatatlan falakkal teli oktatási (főleg felsőoktatási) rendszer nagyon sok szakbarbárt termel. Akik ráadásul sokszor le is nézik a többi szakmát.

--
"Trollhammaren sveper igen..."

Mar jelenleg is tanitanak programozni altalnos iskolaban. Nem mindenhol, nem mindenkit, de van ahol pl. mar hatodiktol. Ismerek olyat, aki magatol kezdett programozni otodikeskent. Szoval nincs azzal semmi gond.
Mar jelenleg is van nonemu programozo, nem is keves. (Amikor en vegeztem / no ez nem ma volt / a velunk parhuzamos progmat szakon tobb lany volt, mint fiu. Az mas kerdes, hogy ott is jocskan volt palyamodositas.)
Szoval annyira nem kell megremulni attol, hogy esetleg lesznek noi informatkusok, mert akkor mar remuldozhetnel par eve.

Tapasztalatból írom, hogy a programozást nem tanítani kell, hanem tanulni magától az embernek. Iskolában kedvet kellene adni ahhoz, hogy a diák leüljön és otthon nekiálljon kódolni. Sajnos ez másképpen nem megy.
Sajnos az a szomorú tapasztalatom, hogy ehelyett pont az ellentettjét csinálják a legtöbb programozás órán. 14 éves gyerekeknek C-t oktatni kész vétek. Mire eljutnának oda, hogy talán alkosson valami látványosat már ráunt az egészre. Főleg ha papíron programoztatják...

Épp pont a C-vel kell kezdeni a programozás oktatását! (Szerintem persze...)

Tudniillik mi mással? Ja igen, azért a C előtt legyen pár óra Bash is, az kell hozzá. De azután rögvest a C, mint az első „igazi” programnyelv.

Nem JS, meg PHP, meg Órlyáskídjónyelv, meg egyéb más baromságok. Egyszerűen nem tudom, mi az ami a C-ben olyan szörnyű volna hogy majdmindenki fosik tőle. Én például soha nem tanultam semmiféle szervezett oktatás keretén belül, magam tanultam meg, s hozzá azt hiszem egész jól. Meg a C++ -t is. Utóbbinál már több az ismerethiányom, elismerem, de azért ami nekem abból kell, azt onnajt is tudom. És akármikor bővíthetem ha akarom.

Persze erre majd jön valaki és jól megaszongya, hogy de nekem könnyű volt mert előtte hekkeltem már a C-64 -et is annak az assemblyjében, és így már nem volt idegen nekem a C aránylag hardware-közeli szemlélete. Igaz. De a C-64 esetén is magamtól tanultam ezt meg, s hozzá német és angol doksikból mert magyar totál nem volt, angolul annyit se tudtam akkor mint most (jellemző, hogy úgy kellett kiszótáraznom azt is hogy mit jelent a „not used”, emlékszem... És akkoriban nem voltak online szótárak sem...), és akkor még németül se tudtam.

És akkoriban csak 18 éves voltam! Oké, most 14 éves gyerekek voltak a téma, de most messze könnyebb is nekik, mert azért a C csak barátságosabb mint a C-64 assemblyje, és van is a C-hez bőséges magyar nyelvű doksi, meg mintaprogramok, minden...

Akinek a C nehéz, aki nem tudja megtanulni, az egyszerűen nem való programozónak, ez a véleményem, s hozzá a saját érdeke is hogy ne menjen annak, mert csak elvesztegeti az idejét. Abban a pillanatban befuccsol, amint olyan feladatba botlik, amihez nem elég az olyan glaszékesztyűs finnyás úrficskáknak való nyelv, mint a Pascal vagy valami más hasonló. Jobb ha az ilyenek mielőbb kiszelektálódnak.

Elismerem, a Pascal talán jó oktatónyelvnek, de úgy kb a 8 éves korosztálynak, nem a 14 éveseknek... Bár, ha belegondolok a pontosvesszős hülyeségeibe hogy ide kell, oda meg nem...

Demonstrálom, mi a baj a C-vel. Mutatok pár rövid kódot, felteszek pár kérdést, te pedig próbáld megválaszolni azokat fejből, anélkül hogy utána néznél vagy lefuttatnád a kódot.


#include <stdio.h>

static int a;
int b;

void foo(void)
{
  static int c;
  int d;

  println("%d %d %d %d\n", a, b, c, d);
}

Kérdés: mit fog kiírni a fenti függvény és miért, ha a memória tartalma korábban 0x0f-fel volt feltöltve minden byteon és 32 bites architektúrára fordítunk?


struct X
{
  int a;
  char b;
  char *c;
};

struct Y
{
  int a;
  char b;
  char *c;
  char d;
};

Mennyit kapunk sizeof (struct X)-re és sizeof (struct Y)-ra és miért? Szintén 32 bites architektúrára fordítunk.

C++-ból már inkább nem kérdezek, nem lenne fair.

Ezeket a snippeteket nem a kisujjamból szoptam, sajnos annyira nem vagyok jó. Miután megválaszoltad a kérdéseket, akár ellenőrizheted is magad, ha elolvasod ezt.

[félig ide, inkább Poli felvetésére]

Egy fokkal nagyobb baj a C-vel szvsz., hogy nem lehet egyszerűen kezdeti sikerélményt adni vele, vagy ha igen, akkor az tele lesz a szokásos "ezzel most ne foglalkozz"-szöveggel:


#include <stdio.h> <- ezzel most ne foglalkozz, mert ahhoz a fordítási folyamatot kéne értened

int main(int argc, char** argv) <- ezzel most ne foglalkozz, ezt így kell, mert csak. Lehet main(void) is, mert miért ne, de nem illik, ne foglalkozz vele
{
    printf("Hello World\n"); <- printf-el tudsz kiíratni stringet, amit a "" jelek közt rakhatsz, a \n a sortörés kivéve ahol nem, ne foglalkozz vele
    return 0; <- ezzel térsz vissza (hogy igazából egy függvényből térsz most vissza, azzal ne foglalkozz), a 0-val ne foglalkozz, majd egyszer elmagyarázzuk, hogy a processzeknek van exit kódja és sikerességet illik 0-val jelezni
}

De pl. egy Java-nál is teljesen ugyanez lenne:


package ...; <- kódszervezés, ne foglalkozz vele, majd később nézzük

import java.foo.asd; <- erre az osztályra (hogy mi az osztály, azzal most ne törődj) szükségünk lesz

class Pelda { <- ezzel deklarálunk egy osztályt, hogy mi az osztály, azzal most ne törődj

  public static int main(String[] args) { <- azzal, hogy mi a 1) public, 2) static, 3) String[] most ne törődj, így kell
     System.out.println("Hello World"); <- A System.out.println()-al tudsz szöveget kiírni, utána új sort kezdve
  }
}

Mindkettőnél 1 sornyi tényleges kódért oda kellett tenni rengeteg "zajt", amit rossz esetben akár hónapokig nem fognak érteni, de bemagolják, mert ÍGY KELL.

Úgyhogy igenis valami script nyelvvel kellene kezdeni, amiből az algoritmizálást megtanulják (és nem azzal szopnak, hogy a "fordítási folyamat így néz ki"), aztán fokozatosan be lehet vezetni a fenti "zajt", amint a hozzájuk kapcsolódó koncepciókat már értik. Szerintem, de nem vagyok tanár.

BlackY

A C-ről nem tudok nyilatkozni, de egy jól összerakott oktatóanyagból azért lehet Javát tanulni kezdeti sikerélmények mellett is. Tényleg van pár dolog, amit az elején csak említenek, de később a helyére kerül. Vagy közben nézhetsz elméleti anyagot is, ahol elmondanak mindent.

--
"Trollhammaren sveper igen..."

Fenti fv semmit nem fog kiírni, mert az összeszerkesztésnél elhal a dolog. Egyrészt a main hiánya miatt, de sokkal fontosabb, hogy nincs println :-)
X struktúra 12, Y pedig 13 byte méretű. Az már más kérdés, hogy feltételeztem, hogy a 32-bites architektúrán az int 32-bites, ami viszont - amikor én tanultam - egyértelműen fordító (rosszabb esteben fordítóparaméterezés) függvénye volt.

Én egyébként C-hez értőknek ezt a kódot szoktam feltenni kérdésként (szerintem már itt is írtam korábban). (ioccc.org, 1981, David Korn - ugye a Korn-shellről elnevezett emberke):


main() {
printf( &unix[ "\021%six\012\0" ], (unix) [ "have" ] + "fun" - 0x60 );
}

Feltétel: UNIX, vagy UNIX-like rendszer (nálam itt bukott el az AIX, mert nem tudta lefordítani); jó fordító (gcc jó, clang/llvm jó, pcc nem jó, de parancssori paraméterrel jóvá tehető); és mindez ASCII (vagy azzal felülről kompatibilis, pl. UTF-8) kódolású rendszeren (EBCDIC nem jó) - mondjuk ez utóbbi nem komoly feltétel.

Sok sikert!

Lehet, hogy 13 byte-nyi adat van benne, a word alignment miatt mas lehet a meret.

Ettol fuggetlenul, ha egy kod epit arra, hogy mekkora a sizeof() _pontosan_, akkor az a kod nem hordozhato egyaltalan, pedig a jo C kodolasnak az lenne a lenyege, hogy hordozhato legyen gepek kozott.
Jo dolog megerteni melysegeben a nyelvet meg a szabvanyt, de ha valaki interop/hordozhato kodot akar irni, es nem uint32_t es tarsait hasznalja, abbol eleve baj lesz.
Aztan csodalkozunk, miert nincs egybol 64-bites verzio bizonyos szoftverekbol.

giga +1
Es nem csak architektura fuggo, hanem fordito is (pl a vcc egeszen mashogy alkalmazza a paddingot mint a gcc).
Ilyen hibakat minden nyelvben el lehet kovetni, ha az ember nem ismeri a sajatossagait. Nem ettol nehez a c, sot, igazabol konnyu;)

// Happy debugging, suckers
#define true (rand() > 10)

Én határozottan úgy emlékszem, hogy a world alignment a struktúra *végén* már nem befolyásolja a struktúra *méretét* - ellenben a közepén persze igen, és ezért nem 9 byte az első struktúra mérete - mert középen *kell- az igazítás. Az már egy másik kérdés, hogy a memóriában egy ilyen strktúra mögött elhelyezkedő következő adat nem a 13., hanem a 16. bájt után tárolódik.
Ami meg a hordozhatóságot illeti, anno ugye volt egy olyan program, amit lint-nek hívtak, és rendes fejlesztő időnként a lint általi nyavalygásokat is ellenőrizte és javította. Ma ez viszont totál nem jellemző - nem véletlen, hogy a FreeBSD-10-hez a GCC-Clang váltás a ports-fánál elég brutál peccs mennyiséget eredményezett :-) (Mellesleg én ezért szeretem azt hangoztatni, hogy időnként fordítsunk másik fordítóval, és annak a nyafogásait is vegyük figyelembe.)

Igen, de az adat+paddingra már lehet, nem? Pl. x86-on egy általános 32 bites regiszter alsó két 8 bites részét lehet külön elérni, tehát ha a teljes 32 bitnyi adatot betölti egy regiszterbe, nagyon nem mindegy, hogy hol van az egy byte adat és hol a padding. Nyilván ez a padding máshová kerül egy little endian és egy bigendian rendszeren, ezért ha azon a rendszeren, ahol a padding után már nincs adat, nem számolódik bele a méretbe, a másikon meg igen, az sokkal inkonzisztensebb, mintha mindkét rendszren beleszámít.

Es sem a padding, sem az alignment nem kene hogy a *vegen* levo objektum meretet megvaltoztatja. Az int / char / char* / char eseten a padding miatt az elso char es a char* kozott lesz folosleges hely - ez a folos hely vilagos, hogy beleszamit a meretbe. Az alignment miatt ez az egesz szar 4-gyel oszthato byte-hataron kezdodik. Meg a kovetkezo ilyen objektum is. De a meretbe miert szamitana be az, hogy a fordito valamiert jonak latja a kovetkezo informaciot X bittel/bajttal arrebb pakolni? Szoval melyik miatt hosszabb az a struktura a kelletenel?

| xxxx | x... | xxxx | x--- |

x hasznos adatteruletet jelent, a "." pedig padding-ot, a | a 4 byte-os hatarokat, azaz az alignmentet. Szerintem pedig a "-" jelenti a struktura veget. Szoval meg mindig nem vilagos, hogy a --- miert resze a strukturanak meret szempontbol. De, mint fentebb irtam, megprobalom elfogani es megjegyezni.

A blokk hatar miatt nagyobb az egesz struktura, hogy a kovetkezo amit foglalsz ne ugy nezzen ki, hogy egy negyed blokk es egy egesz mert akkor tobbet lepesben kell elerni a teruletet, amit feleslegesnek itelt. Ezt persze barmikor felulbiralhatod ha ugy gondolod;)

// Happy debugging, suckers
#define true (rand() > 10)

A blokkhatar beallitas miert a struktura meretet valtoztatja, es nem a strukturak elhelyezeset?

No mindegy, kicsit olvasgattam, es revidealom a velemenyemet. Az, hogy mennyi a strukturak merete a fenti kodban, az meg mindig fordito es beallitasfuggo, mert peldaul nincs megadva, hogy milyen packing pragma volt az altalunk nem lathato kodreszletben :-)

Nos. Kezdem akkor, de olvasd is végig!

1. Tegyük fel, nem lennék képes megválaszolni a kérdéseidet. Ez semmit nem bizonyítana, nem lenne ellenérv arra amit fentebb írtam, mert minden programnyelvben fel lehet tenni olyan kérdéseket, amik csak igen mély ismeretek birtokában válaszolhatóak meg. Nyilvánvaló ugyanakkor, bármely nyelven kezdik is el tanítani a gyerekeket programozni, nem ilyen mélységben kezdik. Az általad felsorolt példák tipikusan ilyenek. Én például bár C nyelven oktatnám a programozást a kisiskolásoknak, de semmi esetre se a sizeof() -fal kezdeném.

2. Eddig nem tudtam róla, hogy létezne println függvény a C-ben. Megtippelem hogy ez talán a Java nyelv része, vagy kevered a writeln utasítással ami emlékeim szerint a Pascalban van. Mindenesetre ha van is ilyen a C-ben én még sosem használtam, becsületesen bevallom.

3. Épp ami a sizeof kérdéseidet illeti, azt semmiképp se válaszolhatom meg úgy, hogy bele ne köthess ha akarsz. Tudniillik, épp most e téren annyira vérprofi vagyok (mert muszáj a programnyelvem tervezéséhez e kérdéskör) hogy teljesen tisztában vagyok vele, a struktúrák mérete architektúra- és implementációfüggő, még akkor is, ha eltekintünk az olyan apróságoktól hogy némely mezőt netán nagy aljasul szóhatárra igazít a compiler! (holott az is megtörténhet). Nem beszélve arról, hogy te a struktúrába pointert is belepakoltál, az meg végképp olyasmi, aminek a mérete semmi esetre se garantálható „ránézésre”.

Na de kérdem én, egy kezdőt akit C nyelvre akarsz oktatni, ezzel fárasztanál le a legelején?! Én amikor elkezdtem tanulni a C nyelvet, nem a pointerekkel kezdtem. Hamar megbarátkoztam velük az igaz, de a MÉRETÜK soká-soká nem érdekelt, emiatt a sizeof() sem. Remekül megvoltam ezek nélkül tényleg nagyon sokáig. Azaz a C ettől még simán alkalmas kezdőknek.

Végezetül hogy ne hidd azt, hogy mindezt igazából nem tudtam, s netán mások irkálmányaiból puskáztam, idemásolom a programnyelvemről íródó könyvemnek pont azt a részét ami e kérdéskört boncolgatja (mert muszáj volt sajna...):

-------------- IDÉZET KEZDŐDIK! ---------------

Azaz, vegyük csak fel a következő deklarációt:


union V { // Az univerzális változó

unsigned char      c[16]; // Mérete  1 bájt
  signed char      C[16]; // Mérete  1 bájt
unsigned short int i[ 8]; // Mérete  2 bájt
  signed short int I[ 8]; // Mérete  2 bájt
unsigned int       l[ 4]; // Mérete  4 bájt
  signed int       L[ 4]; // Mérete  4 bájt
float              f[ 4]; // Mérete  4 bájt
unsigned long long g[ 2]; // Mérete  8 bájt
  signed long long G[ 2]; // Mérete  8 bájt
double             d[ 2]; // Mérete  8 bájt
long double D;            // Mérete 16 bájt

};

// A V unionban elhelyezkedő mezők egymáshoz viszonyított pozíciói:

// |  c[0] |  c[1] |  c[2] |  c[3] |  c[4] |  c[5] |  c[6] |  c[7] |  c[8] |  c[9] | c[10] | c[11] | c[12] | c[13] | c[14] | c[15] |
// |  C[0] |  C[1] |  C[2] |  C[3] |  C[4] |  C[5] |  C[6] |  C[7] |  C[8] |  C[9] | C[10] | C[11] | C[12] | C[13] | C[14] | C[15] |
// |     i[0]      |     i[1]      |     i[2]      |     i[3]      |     i[4]      |     i[5]      |     i[6]      |     i[7]      |
// |     I[0]      |     I[1]      |     I[2]      |     I[3]      |     I[4]      |     I[5]      |     I[6]      |     I[7]      |
// |             l[0]              |             l[1]              |             l[2]              |             l[3]              |
// |             L[0]              |             L[1]              |             L[2]              |             L[3]              |
// |             f[0]              |             f[1]              |             f[2]              |             f[3]              |
// |                             g[0]                              |                             g[1]                              |
// |                             G[0]                              |                             G[1]                              |
// |                             d[0]                              |                             d[1]                              |
// |                                                               D                                                               |

Sajnos az union változóinak fentebb felvázolt egymáshoz viszonyított elhelyezkedése csak ROPPANT VALÓSZÍNŰ (mármint Intel processzoros PC gépek esetében, 64 bites gépen), de igazából nem garantált. Azért nem, mert valami perverz indíttatástól vezettetve a C és C++ nyelveket úgy konstruálták meg, hogy ezen alaptípusoknak már a MÉRETE SEM GARANTÁLT, hanem architektúra- és implementációfüggő. Elméletileg - azt hallottam legalábbis - még az se garantált, hogy egy char változó 8 bites. Mondjuk ez elég valószínű persze, de akkor se TOTÁL biztos azért. Mindenesetre, többnyire azért biztosak lehetünk a fent felvázolt elhelyezkedésben, s abban, hogy 1 ilyen union összesen 16 bájtot foglal el, eképp a teljes unsigned char tartományra eső 256 darab efféle mindösszesen 4096 bájtot, vagyis pont 4 kilobájtot, ez majdnem biztos hogy így lesz igaz minden épeszű architektúrán. De akkor is csak MAJDNEM lesz biztos és nem TELJESEN, mert vannak nem épeszű architektúrák és fordítóprogramok is, vagy legalábbis effélék nem kizárhatóak. Mint említettem, mindezt Intel processzoros gépen próbáltam ki, 64 bites architektúrán, konkrétan egy Lenovo ThinkPad T530 -as gépen, s természetesen Linux operációs rendszerrel, a GCC csomag 4.8.1 -es verziójával, annak g++ fordítóprogramjával.

Ami a 32 bites rendszereket illeti, ott feltételezhető, hogy a long int felel meg a 4 bájtos méretnek, és a long double mérete 10 bájt, miközben a közönséges (signed vagy unsigned) int mérete csak 2 bájt. Hogy szarjon sündisznót de ne is egyet az a seggfej, aki efféle kavarást megengedhetőnek tartott és így találta ki e nyelvet!

----------- IDÉZET VÉGE! ---------------

A fentiekből kitűnik, vannak a C-nek olyan tulajdonságai, amik nekem nagyonis nem tetszenek. Ezek ellenére, igenis ezt tartom a legjobbnak jelenleg kb majdnem minden célra. Oktatásra pláne.

Akkor is igaz lesz ez ha elkészül a magam programnyelve. Az cseppet se oktatási célra lesz szánva, s előre biztos vagyok benne hogy bár nem lesz túl nehéz, de a C akkor is könnyebb lesz mint az „én” nyelvem.

Először is, gratulálok a könyvben használt irodalmi stílushoz, nagyon szakmainak tűnik.

perverz indíttatástól vezettetve a C és C++ nyelveket úgy konstruálták meg, hogy ezen alaptípusoknak már a MÉRETE SEM GARANTÁLT

Az a perverz indíttatás a hatékonyság volt, akár a hordozhatóságot feláldozva is.

Elméletileg - azt hallottam legalábbis - még az se garantált, hogy egy char változó 8 bites.

Elméletileg - azt hallottam legalábbis - a kacsacsőrű emlős nem is létezik, csak egy összeesküvés része. http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf 5.2.4.2.1:

— number of bits for smallest object that is not a bit-field (byte) CHAR_BIT

Ami a 32 bites rendszereket illeti, ott feltételezhető, hogy a long int felel meg a 4 bájtos méretnek, és a long double mérete 10 bájt, miközben a közönséges (signed vagy unsigned) int mérete csak 2 bájt.

A kedvedért indítok egy 32 bites rendszert és kipróbálom a következő kódot:


#include <stdio.h>

int main(int argc, char** argv)
{
 printf("long int: %d\n", sizeof(long int));
 printf("long double: %d\n", sizeof(long double));
 printf("signed int: %d\n", sizeof(int));
 printf("unsigned int: %d\n", sizeof(unsigned int));
 return 0;
}

gcc 4.7.2 (Debian 4.7.2-5)
long int: 4 (<- ez stimmel)
long double: 12 (<- ez nem)
signed int: 4 (<- ez sem)
unsigned int: 4 (<- ez sem)

BlackY

Nézd, amit írtál hogy a 32 bites rendszer alatt neked nem ezek az értékek jöttek ki e típusok sizeof-jára, az épp engem igazol hogy micsoda hülye dolog, hogy ezek nem garantáltak a C nyelvben.

Én elismerem hogy ezeket nem teszteltem 32 bites Linuxszal. Emlékezetből írtam, abból az időből valók az emlékeim amikor még win98 alatt írtam asszem BorlandC fordítóval programot. (Ezelőtt kb 10 évvel vagy még többel). Akkor e típusoknak ezek voltak a méreteik nálam.

Simán elképzelhetőnek tartom hogy neked van igazad méretek tekintetében 32 bites Linux alatt. Mindez nyilvánvalóan azt jelenti, hogy e téren nem szabad semmit se feltételezni alapból, hanem ha netán portolni akarom majd valamikor a programnyelvemet 32 bites architektúrára, akkor előbb ott konkrétan azon a rendszeren meg kell néznem, melyik típus milyen méretű. Ezt azonban tudtam eddig is. És vedd észre, épp ezt is írtam fentebb, kihangsúlyoztam hogy a méretek nem garantáltak!

A sílusom meg olyan, amilyen, a magamé, leginkább viszont semmilyen, mert stílusa a karatemestereknek van. Amúgy megszokhattátok a korábbi műveimből is, hogy nálam gyakoriak az efféle érzelemdús kiszólások.

"Nézd, amit írtál hogy a 32 bites rendszer alatt neked nem ezek az értékek jöttek ki e típusok sizeof-jára, az épp engem igazol hogy micsoda hülye dolog, hogy ezek nem garantáltak a C nyelvben."
Nem hülye dolog, ezt hívják alkalmazkodásnak (sajnos ez utóbbi szót sajnos te nem ismered:().

"Én elismerem hogy ezeket nem teszteltem 32 bites Linuxszal. Emlékezetből írtam, abból az időből valók az emlékeim amikor még win98 alatt írtam asszem BorlandC fordítóval programot. (Ezelőtt kb 10 évvel vagy még többel). Akkor e típusoknak ezek voltak a méreteik nálam."
Mint már párszor kifejtettem, nem csak a host architektúra határozza meg a méreteket. Az hogy te mit hiszel, az meg alapvetően nem döntő, az meg hogy 10 éve mit barmoltál már össze, szintén nem.

"Simán elképzelhetőnek tartom hogy neked van igazad méretek tekintetében 32 bites Linux alatt."
Neki sincs igaza, pont ezért nem is szentírásként írta, hanem útmutatásként hogy ezek az adott környezetben értendő méretek, okát lásd fentebb.

"És vedd észre, épp ezt is írtam fentebb, kihangsúlyoztam hogy a méretek nem garantáltak!"
Ő is ezt hangsúlyozta ki, de legalább alátámasztotta és nem hülyeséget hordott köré, hogy miért nem.

"A sílusom meg olyan, amilyen, a magamé, leginkább viszont semmilyen, mert stílusa a karatemestereknek van."
Az írásnak/írásmódnak is van stílusa. Bár ezt neked tudnod kéne nem? De lehet hogy suttyomban mormolsz magadnak valamit, az is egy stílus, bár csak erre korlátozódnál.

"Amúgy megszokhattátok a korábbi műveimből is, hogy nálam gyakoriak az efféle érzelemdús kiszólások."
Kár hogy az érzelemdús dolgoknak egyrészt nincs mögöttes töltete, mivel hiszem/sejtem/gondolom elveken alapul, gyakorlatias és alátámasztott érveken sajnos nem.

// Happy debugging, suckers
#define true (rand() > 10)

C-ben a méretek egyáltalán nem garantáltak semmilyen esetben sem (pont a platform függetlenség okán), ha garantált méreteket szeretnél, a fordítóhoz kell fordulnod (pl.: ha biztosan egy 64 bites unsigned integert szeretnél, akkor használd az uint64_t -t, ami viszont platform függő, aztán vagy van, vagy nincs).
A fent vázolt union-od egyáltalán nem biztos (de legalább biztos hogy nem minden esetben) 16 byte-ot foglal majd el.
Sikerült elég konyhanyelven megfogalmaznod ezt az egészet, ráadásként össze vissza beszélsz benne:\

// Happy debugging, suckers
#define true (rand() > 10)

2: igen ezt már fenn elismertem, java miatt reflexből ln-nel postfixeltem f helyett.

Úgy az egészre: az a baj hogy a C tele van ilyen architektúra és implementációfüggő részletekkel, a rengeteg undeclared és unspecified dolgokról már nem is beszélve. Ezek komoly problémákat okozhatnak, különösen egy kezdőnél, aki még nem ismeri a best practice-eket. A C egy nagyon alacsony szintű nyelv, nem tudod sokáig kerülgetni a pointerartimetikát vagy épp a sizeofot. Tehát a C learning curve-je a kezdeti nagyon enyhe emelkedés (a szintaktika tényleg egyszerű) után nagyon meredekké válik, ezért én nem tartom jó ötletnek első nyelvként. Azt elismerem, hogy a C-re is szükség van, megvan a maga helye, de nem jó mindenre. Sőt, a legtöbb problémára vannak jobb programozási nyelvek is.

Igen, a C tényleg tele van ilyesmikkel, de ezesetben hozhattál volna még szignifikánsabb példát is: a #define, meg ifdef meg stb részeket, na azoktól ha olyasmire bukkanok egy include fájlban nekem is kezd kiütés nőni a lelkemen.

Ellenben kérlek vedd már észre, épp azt emeltem ki fentebb hogy egy KEZDŐnek ezzel még nem kell foglalkoznia!

Annyit elhiszek neked amúgy, akadnak nyelvek amiken sokkal előbb lesz sikerélménye, s könnyebben tanulható egy bizonyos határig. NINCS VITA, ismétlem ezt elhiszem. Én csak azt mondom hogy:

1. A C nem olyan szörnyű nehéz mint híresztelik, akkor se az ha akadnak nála is könnyebb nyelvek.

2. Aki nem képes megbírkózni első nyelvként a C-vel, az nagyonis kérdéses hogy alkalmas-e programozónak. Foglalkozzon inkább keresztszemes minták hímezgetésével...

2. Aki nem képes megbírkózni első nyelvként a C-vel, az nagyonis kérdéses hogy alkalmas-e programozónak. Foglalkozzon inkább keresztszemes minták hímezgetésével...

Aki nem képes megbírkózni első nyelvként a C-vel, az akkor szerinted ne tudjon hatékonyan irodai munkát végezni?

Merthogy az is programozás, hogy a saját munkád megkönnyítendő összedobsz néhány makrót *office-ban. Ezt a szintet bőven le lehetne adni általános/középiskolákban nem infós csoportokban is (max. kevésbé komoly számonkéréssel, ha már a tantervben nincs benne) és ha csak 10% (ez egy 30 fős standard osztályban 3 embert jelent!) később hasznosítani tudja, már volt értelme. Az meg, hogy nem lehet kernelt fejleszteni JavaScript/VB script-ben, hátúristen. Aki kernelt akar fejleszteni majd önszorgalomból/egyetemen megtanulja, de ne vegyük már el az automatizálás lehetőségét mindenkitől csak azért.

Amúgy egy ma előforduló ilyen automatizálási cucc: mi a legrövidebb kód, amivel egy oldalról le tudod tölteni az összes, előnézeti képpel linkelt (<a href="..."><img></a@gt;) képet egy oldalról?

BlackY

Ebben neked igazad is van. Attól tartok, amiatt alakult ki e vita köztünk eszerint, mert nem egészen ugyanazt értjük „programozni tanulás” alatt.

Mert igen, igazad van, hasznos lehet ha az irodai dolgozó tud makrókat írni, eszem ágában sincs ezt vitatni! Csakhogy a szememben az cseppet se programozás, a szó eredeti, „ősi” értelmében. Mondjuk akkor azt, hogy ezek nem programozni tanulnak, hanem „makrót írni”. És ehhez nem is kell külön programozási óra, hanem egyszerűen az irodai programok kezelésére fenntartott órákon tanulják, mint „haladóbb” színvonalú ismereteket, vagy esetleg valami szakkörön azoknak akiket komolyan érdekel ez mert tényleg ilyen pályán akarnak elhelyezkedni. Semmi kifogásom ellene. És igen, ezeknek valóban nem is a C-vel kell kezdeni hanem valami olyan micsodával ami vélhető hogy benne lesz az általuk használt irodai programban, azaz a LO-ban mondjuk.

Ez a szememben azonban rém messze van a programozástól. És remélem aki összedob egy effélében pár makrót, azt te se nevezed igazán programozónak. Lehet hogy valamikor az lesz, lehet hogy van hozzá tehetsége is, de ha még csak erre képes, akkor még nem az.

Aki erre képes, az egy jól felkészült irodai dolgozó, szó se róla. (Igazából illene mindnek ilyennek lennie...). De nem programozó. A programozó, az azért ennél több. Ez olyan, hogy aki fel tudja fújni a leeresztett bicikligumit, az még nem lenne megfelelő egy kerékpárszervízbe hogy ott dolgozzon. Aki ki tud cserélni egy gyújtógyertyát, még nem lesz autószerelő, akkor se, ha sokan a gyújtógyertyát se tudják kicserélni.

Vagy más példával: sokan képesek meghegeszteni a kerítésüket. Ez remek dolog hogy képesek erre, hasznos is és dicséretre méltó tudás. De azért ettől ők még ugye nem lesznek HEGESZTŐK a szemedben?! Nem bíznád rájuk ugye egy atomerőmű főkeringtető vezetékének a meghegesztését?! Egyáltalán, semmi olyat ahol van egy PICI KIS minőségi követelmény is?! Nem véletlenül vannak effélékre tanfolyamok meg minősítő vizsgák...

Ez szép és jó, csak két problémám van vele:

1) az általános és középiskoláknak nem az a célja, hogy programozókat, mikrobiológusokat, matematikusokat, ... képezzenek, hanem hogy adjanak olyan ismeretalapot, készségeket, szociális és társadalmi normát, ami minden embertől elvárható, illetve - és ez a lényeg - a tehetségeket megismerje és támogassa. Jó esetben például marhára nem annak kéne a normának lennie, hogy mindenki mindenből kitűnő. Mert ha mindenki kitűnő, akkor senki nem az; az osztályzatoknak valahol egy Gauss görbét kéne mutatniuk a hármassal középen. Innentől kezdve a tananyagot te nem határozhatod meg úgy, hogy az a tényleg kitűnőknek legyen az elvárt szintje, az átlagra kell céloznod. Az átlag meg nem fog C-ben programozni, hanem - ha például ez bekerülne az oktatásba, mint érettségizettektől elvárható tananyag - a magasabb nyelveken.

2) Az, hogy valaki programozó vagy nem, meg nem megítélés kérdése, egy főállás vagy végzettség miatt lesz az valaki. az, hogy te mit tartasz programozásnak, ebben a topicban nagyjából érdektelen - vegyük a Wikipedia definícióját alapul:

Computer programming (often shortened to programming) is a process that leads from an original formulation of a computing problem to executable programs. It involves activities such as analysis, understanding, and generically solving such problems resulting in an algorithm, verification of requirements of the algorithm including its correctness and its resource consumption, implementation (or coding) of the algorithm in a target programming language, testing, debugging, and maintaining the source code, implementation of the build system and management of derived artefacts such as machine code of computer programs. The algorithm is often only represented in human-parseable form and reasoned about using logic. Source code is written in one or more programming languages (such as C++, C#, Java, Python, Smalltalk, JavaScript, etc.). The purpose of programming is to find a sequence of instructions that will automate performing a specific task or solve a given problem. The process of programming thus often requires expertise in many different subjects, including knowledge of the application domain, specialized algorithms and formal logic.

(kiemelés tőlem)

Van ott sok minden szép és jó (szoftverfejlesztési modellek standard elemeitől kezdve), viszont a kiemelt mondat a lényeg: a végfelhasználó (aki ugye esetünkben maga a program írója) nem elvont problémákat akar megoldani, hanem a saját valós problémáját; és ha már van lehetősége rá, akkor nem úgy, hogy biteket tologat C-ben vagy a fél világot körbenézi a megfelelő library-k után. A kriptográfus nem arra keres algoritmust, hogy hogyan lehet gyorsan n-edik gyököt vonni modulo N, hanem hogy megtörje az RSA-t. A közös a kettőben az, hogy mindketten egy lépéssorozatot keresnek, amivel elágazásokkal, ciklusokkal stb. elérhetik a kívánt eredményt*.

Márpedig ha a felhasználónak össz-vissz annyi a nyűgje, hogy - a fenti példánál maradva, amire még nem kaptam C-s választ - le akarja szedni azokat a képeket és nagyjából mindegy, hogy a program 5 vagy 20 percig fut, ha neki 10 perc megírnia, míg kézzel leszedegetve három óra lenne, akkor a helyes megoldás nem a C, hanem az alkalmasabb eszköz használata; merthogy ha csak össze pipe-ol két processzt bashben, már az is programozás.

Szerk.: Kicsit rendbe szedtem egy-két mondatot, este van már

BlackY
*: légyszi-légyszi senki ne hozza fel a nem-imperatív programozást

Figyu, most miért ragaszkodol hozzá, hogy épp C nyelven írjak meg egy efféle képleszedő izét neked? Nyilvánvaló, hogy erre a Bash megfelelőbb. Pláne a Zsh. (Már ha tényleg csak a képek leszedése a feladat). Meghívom benne megfelelően felparaméterezve a wget progit és kész. Sőt, megkockáztatom, elképzelhető hogy nem is kell semmiféle bash körítés, mert ha jól emlékszem a wget-nek van valami kapcsolója (talán a -i ?) amivel rögvest meg lehet neki adni egy url-eket tartalmazó állományt, s ami abban van azokat az url-eket letölti. Csak azt nem tudom hirtelenjében, nem bolondul-e meg ha van az url-ek mellett sok más szöveg is. De lehet hogy van nagy mázli, és simán megkajálja azt a html oldalt így is! Mindenesetre ebben az irányban indulnék el.

Ha meg nincs ilyen mázli, ott a grep, sed, netán awk. Erre találták ki ezeket. Ettől azonban simán meg tudnék írni effélét natúr C-ben is csak nem tudom minek kéne ezt bizonygatnom. Remélem nem hiszed rólam hogy képtelen vagyok rá, amikor épp programnyelvet írok C-ben, ami azért ennél nagyságrendekkel nagyobb bonyolultságú meló!

Mindez azonban nem ellenérv az állításaimra. Tudniillik aki effélét nem képes megírni C-ben, az nagy eséllyel bash-ban se fogja neked összehozni. Ha csak arra képes hogy valami Basic-szerűségben villogó betűkkel írjon ki üdvözlő szövegeket a képernyőre (márpedig gyerekeket programozás címén ilyen iszonyatosan magas „bonyolultságú” dolgokra oktatnak csak sajnos) annak a grep, sed is nehéz lesz, az awk meg „jujédesistenkém menekülökinnen” reakciót vált ki belőlük.

Ezért kéne C-vel kezdeni. Ha egyszerűbbel kezded, hozzászoktatod őket ahhoz a könnyűségi szinthez, s később fintorognak majd a C-től, de a bash-tól is. Épp mint a Win-userek: megszokták hogy a Windows könnyebb mint a Linux, s az istennek se térnének át!

A rossz beidegződés, a szokás hatalma.

Ja és ha azt a képleszedést Bash-ban oldom meg összevissza pipeolva a processzeket, az azért a szememben még nem „igazi” programozás, tudod. Igen, a bash erre alkalmasabb mint a C, elismerem, de ez nem azonos annak elismerésével hogy ha összedobok erre egy 2-3 soros szkriptet azt bármféle értelemben is komoly programozásnak nevezzem.

Ezt nem amiatt írom, mintha magamat profi programozónak tartanám, s „védeném a mundért”. Nem. NEM TARTOM MAGAMAT PROFI PROGRAMOZÓNAK. Ettől azonban tisztelem még annyira a szakmát, hogy ne osztogassam a „programozó” címkét arra méltatlanoknak.

Egy efféle dolog mint a kép leszedése a fenti példádban, ha meg van írva bash shellben, az akkor kb annyi bonyolultságot igényelne, mint egy makró megírása, igen. Lehet hogy definíció szerint az egy program, de akkor is csak egy olyan alacsony szintű izé, hogy... szóval disztingváljunk azért! Aki csak arra képes, az igenis NEM TUD programozni még!

Megjegyzem ha C nyelven írnék meg effélét, akkor is csak az URL kibányászására használnám a C lehetőségeit, a végén úgyis egy system parancs lenne belőle amivel meghívom a wget progit, emiatt is nem látom sok értelmét ezt C nyelven megoldani. Amint azonban kicsit is bonyolódna a példa, mondjuk lenne 10 különböző kritérium, hogy csak az ezeknek megfelelő url-eket kell letölteni, mindegyiket más könyvtárakba elmenteni, netán figyelve azt is hogy van-e már olyan néven letöltve valami mert ha igen azt nem szabad felülírni hanem előbb át kell nevezni, mondjuk hozzáfűzni a dátumot a fájlnévhez, stb, akkor már igenis C nyelven írnám meg! Annak ellenére, hogy még ez is megoldható lenne bash shellben. Mégis, akkor már én a C megvalósítást preferálnám.

Meghívom benne megfelelően felparaméterezve a wget progit és kész.

Nem szerepelt a feltételek közt, de van ott csomó content, ami nem kell kategória.

Ha meg nincs ilyen mázli, ott a grep, sed, netán awk. Erre találták ki ezeket.

Nem, ezeket szövegmanipulációra találták ki. És - ugyanúgy, ahogy egy-két topic alapján sokaknak másoknak is - az a gond, hogy céleszköz helyett a feladatra jóval kevésbé alkalmas eszközt választanál. Itt a szövegmanipulációs eszközöket, fentebb oktatáshoz a C-t. És nem azt mondom, hogy nem oldanád meg; nem a legalkalmasabb eszközt használnád rá. Amúgy egy három soros perl (?) scriptet előztem meg egy egy soros PHP kóddal (valami ilyesmi: <?php foreach((new XPath(@DOMDocument::loadHTMLFile('url')))->query('..') as $node) file_put_contents(basename($node->getAttribute('href')), file_get_contents($node->getAttribute('href'))) ?>) - igen, C-ben meg lehetne írni töredék futási idővel és memóriaigénnyel - többszörös idő alatt. Ami sokat számít, hanem for-fun kódolsz.

Tudniillik aki effélét nem képes megírni C-ben, az nagy eséllyel bash-ban se fogja neked összehozni.

Ööö... nem? Pont te írtad, hogy a legalapabb shell parancsokkal (szövegmanipuláció, wget) meg lehet csinálni. C-ben vagy használsz valami library-t a szövegmanipulációra, vagy megírod magad. C-ben vagy használsz valami library-t a HTTP kliens implementálására, vagy megírod magad. A shell viszont - a parancssoros eszközökkel azok összekötési lehetőségekkel - ad egy absztrakciót az elvégzett feladatok felett; és ami lényeges, hogy egyértelmű és konzisztens interfészen keresztül (in/out/err streamek, parancssori paraméterek, kapcsolók stb.)

annak a grep, sed is nehéz lesz, az awk meg „jujédesistenkém menekülökinnen” reakciót vált ki belőlük.

Annak aki életében nem hallott a reguláris kifejezésekről valóban nehéz lesz a grep - a C-ben viszont (szemben mondjuk kb. minden 90-es évek utáni nyelvvel) sem nyelvi, sem standard library szinten nincs regexp. Úgyhogy itt a C vagy tárgytalan, vagy hátrányból indul (vesd össze az általad utált JavaScript-tel, ahol nyelvi elem a RegExp, ugyanúgy, mint a string vagy szám literál).

Ha csak arra képes hogy valami Basic-szerűségben villogó betűkkel írjon ki üdvözlő szövegeket a képernyőre (márpedig gyerekeket programozás címén ilyen iszonyatosan magas „bonyolultságú” dolgokra oktatnak csak sajnos)

És az analitikus gondolkodásra kicsit is fogékony gyerek ebből rájön, hogy egyszerű kompozícióval hat egyszerű műveletből (egy ciklus, egy számláló, egy modulo képzés, egy elágazás, kétféle színezett szöveg kiírása, képernyő törlés) össze tud rakni egy összetett műveletsort. Algoritmizál.

Ezért kéne C-vel kezdeni. Ha egyszerűbbel kezded, hozzászoktatod őket ahhoz a könnyűségi szinthez, s később fintorognak majd a C-től

Nem. Pont ezért NEM kéne C-vel kezdeni. Mert nagyon nem mindegy, hogy az a hat egyszerű műveleted milyen szintű. Továbbmegyek: szerintem kiírnánk egy szavazást arról, hogy mit csinál a fork() kernel-hívás, több C programozó is leírná a glibc fork() függvényének a működését; miközben egy ideje már nem is a fork rendszerhívást használja a glibc fork() függvénye, hanem a clone-t (http://man7.org/linux/man-pages/man2/fork.2.html Notes rész). A glibc ad egy absztrakciót a kernel felett - akkor ezt most ne használjuk, mert az emberek hozzászoknak a kényelemhez?

A második feléhez: és az miért baj? Miért baj az, hogy egy nagyon alacsony szintű eszköztől ódzkodnak az emberek. Rendszerközeli dolgokhoz tényleg ideális, pont azért, mert alacsony szintű, de pl. egy nagyvállalati szoftvert ugyan ne C-ben kelljen csinálnia (vagy akkor szerinted a Java EE-vel dolgozók nem is programozók? Megkockáztatom, van köztük olyan, aki életében nem írt egy sor C kódot, egyszerűen azért, mert nincs rá szüksége, ő más absztrakciókkal dolgozik)

Ja és ha azt a képleszedést Bash-ban oldom meg összevissza pipeolva a processzeket, az azért a szememben még nem „igazi” programozás, tudod. Igen, a bash erre alkalmasabb mint a C, elismerem, de ez nem azonos annak elismerésével hogy ha összedobok erre egy 2-3 soros szkriptet azt bármféle értelemben is komoly programozásnak nevezzem.

Ezt nem amiatt írom, mintha magamat profi programozónak tartanám, s „védeném a mundért”. Nem. NEM TARTOM MAGAMAT PROFI PROGRAMOZÓNAK. Ettől azonban tisztelem még annyira a szakmát, hogy ne osztogassam a „programozó” címkét arra méltatlanoknak.

Különítsük el a programozó szakmát (amit mondjuk felsőfokú képzésben való részvétellel és ezzel töltött munkával lehet megismerni és elsajátítani) a programozástól, mint tevékenységtől. Nem mindenki, aki programozik programozó, de minden programozó programozik. Vagy ilyesmi.

Más: egész pontosan mi nálad a programozás alsó határa?

Megjegyzem ha C nyelven írnék meg effélét, akkor is csak az URL kibányászására használnám a C lehetőségeit, a végén úgyis egy system parancs lenne belőle amivel meghívom a wget progit, emiatt is nem látom sok értelmét ezt C nyelven megoldani. Amint azonban kicsit is bonyolódna a példa, mondjuk lenne 10 különböző kritérium, hogy csak az ezeknek megfelelő url-eket kell letölteni, mindegyiket más könyvtárakba elmenteni, netán figyelve azt is hogy van-e már olyan néven letöltve valami mert ha igen azt nem szabad felülírni hanem előbb át kell nevezni, mondjuk hozzáfűzni a dátumot a fájlnévhez, stb, akkor már igenis C nyelven írnám meg! Annak ellenére, hogy még ez is megoldható lenne bash shellben. Mégis, akkor már én a C megvalósítást preferálnám.

system-mel hívogatni dolgokat nem lesz túl hordozható. A második mondatod pedig a tökéletes leírása annak, amiről egész eddig beszéltem: "mondjuk hozzáfűzni a dátumot a fájlnévhez". Ez alkalmas eszközzel egész pontosan egy sor. C-ben ugyanehhez le/újra kell foglalnod az új fájlnévnek a memóriát [ellenőrizni, hogy NULL-e a visszakapott pointer, ugyebár], str/memcpy-vel pakolgatni a karaktereket [előtte persze keresgélni a legutolsó .-ot], előállítanod a dátum szöveges reprezentációját etc. Vagyis a tényleges probléma helyett egy alacsonyabb szintű, az eredetitől teljesen független probléma megoldásával kell foglalkoznod, ha pedig még jól is akarod csinálni, akkor rengeteg további problémát kell sorban megoldanod (minden műveleted sikeres volt-e, minden bájtot kiírt-e egy printf stb.). Erre rávenni olyan tanulókat, akiket valószínűleg az egész nem érdekel többé-kevésbé megoldhatatlan feladat, és még ha sikerül is - nem sokat értél vele.

BlackY

Érdekes, itt a HUP-on úgy tapasztaltam, hogy csaknem kivétel nélkül kijön mindenkiből a troll, ha valami ellenvéleményt fogalmazok meg, s azt sokáig védem. Előbb utóbb elunják az érdemi választ, s átmennek bunkóba. Veled ellenben mintha lehetne értelmesen beszélgetni, ami azért is jó, mert íme kiderül, hogy ha a téma mélyére ásunk, tulajdonképpen nem is különbözik olyan rémségesen a nézetünk!

Azaz, a fenti hozzászólásoddal lényegében egyetértek, egyetlen aprócska módosítással, bár igazából az se módosítás hanem egy új szempont de erről később. Mert most arról szólanék, hogy az hogy ennyire különbözőnek tűnt eleinte a véleményünk, most meg ennyire egyetértek veled, elültette bennem azt a sanda gyanút, hogy talán a LEGTÖBB hupos vitám abból fakad, hogy néha nem egészen ugyanazt értem egyes szavak alatt mint itt a többség!

Mert itt ezen esetben is: kiderült, hogy a „programozás tanítás” alatt én kifejezetten azt értem, hogy leendő programozókat képezni. Te nem ezt értetted. Miután ez tisztázódott, kiderült hogy én a „programozás” alatt kifejezetten azt a tevékenységet értem, ami rendkívül mély, professzionális vagy azt legalábbis némely részleteiben megközelítő ismereteket igénylő műveletsort értem - te nem, te ezt mindenre érted, ami algoritmizálható, még ha erre egy írni alig tudó kisiskolás is képes, annyira nem sok koncentrációt igényel. Számodra ez is már programozás, míg én ennél magasabbra tenném a lécet e szó definiálásakor.

Szóval, azt hiszem ezen disztinkciók után én tulajdonképpen egyetértek veled, de hogy biztos ne tévedjünk (már nem bízom magamban hogy tutira jól értem a szavakat):

- Én azt állítom, hogy AZOKNAK, akik kifejezetten PROGRAMOZÓI PÁLYÁRA KÉSZÜLNEK, mert ebből akarnak megélni, ezt tehát profi szinten akarják űzni, azoknak a C nyelvet kell tanítani elsőként, mint olyan programnyelvet amit már „komoly” programnyelvnek nevezünk, és nem valamiféle kifejezetten gyerekeknek szánt, bevallottan játéknyelvnek, mint mittudomén „turtle graphic”, asszem régen volt valami efféle nevű, bár nem esküdnék meg rá.

És igen, teljesen elképzelhetőnek tartom hogy egy 14 éves kiskölyök is már úgy dönt hogy ő programozó szeretne lenni. S ekkor neki is a C kell legyen a tantárgy, és ha neki e korban ez már komoly döntés, akkor igenis megbirkózik vele.

Aki nem dönt úgy hogy ő programozónak megy, az oké, tanuljon mást, csakhogy azt én nem nevezem programozástanulásnak, hanem csak mondjuk „makrótanulásnak”. De ez csak elnevezésbeli különbség, mert amúgy egyetértek veled hogy akkor miket tanuljon.

Az hogy egyetértünk-e abban hogy kifejezetten a programozói karrierre készülőknek a C legyen az első „igazi” nyelv amit tanulnak, az egy másik kérdéskör. Én azért tartom helyesnek, mert aki azt nem ismeri, az nem ismeri semennyire se a gép belső világát, s fogalma se lesz emiatt arról, kb mire fordul le az a magas szintű nyelven írt kódsor amit összehozott, s emiatt milyen erőforrásokat igényel.

Na és amit az elején felvetettem, hogy van egy picike ellenvetésem azért:

Ezt írtad:

Erre rávenni olyan tanulókat, akiket valószínűleg az egész nem érdekel többé-kevésbé megoldhatatlan feladat, és még ha sikerül is - nem sokat értél vele.

Teljesen igazad van, de mint fentebb kifejtettem én olyanokról beszéltem akik maguk is szeretnének programozók lenni. FŐÁLLÁSÚ, PROFI programozók. Olyan tanulóktól ezt igenis elvárhatónak tartom.

Aki viszont nem akar úgyse programozó lenni... Hm, azt miért is kéne egyáltalán minimális szinten is megtanítani programozni?! Mert szerintem abszolút nem kéne. Ezen erőfeszítés helyett az legyen inkább az oktatás iránya hogy neki a szövegszerkesztés ne a Microsoft Wordot jelentse hanem akármilyen más szövegszerkesztővel is elboldoguljon, azzal többre menne ő maga is, és a gazdaság is...

Ez így már korrekt, két észrevétel:

Én azért tartom helyesnek, mert aki azt nem ismeri, az nem ismeri semennyire se a gép belső világát, s fogalma se lesz emiatt arról, kb mire fordul le az a magas szintű nyelven írt kódsor amit összehozott, s emiatt milyen erőforrásokat igényel.

Egyetemen kb. pont ezzel a mondattal (meg a 80-20 szabályra hivatkozással) racionalizálták az assembly oktatást :) Minden szintnél van eggyel lentebb, valahol húzni kell egy határt. Az ottani tantervet meg nagyjából jónak tartom azért, mert így (felületesen ugyan, de) végigment majdnem a teljes skálán (szerencsére programozóknak a forrasszunk áramköröket móka megy), de azért fenntartotta a magasabb szintű nyelvek dominanciáját (alapozó C-ben, párhuzamosan assembly-vel, utána majdnem végig Java, 1-1 kurzusban kitérve C#-ra és a más típusú nyelvekre).

Aki viszont nem akar úgyse programozó lenni... Hm, azt miért is kéne egyáltalán minimális szinten is megtanítani programozni?!

Akkor átfogalmazom: aki nem akar programozó lenni, azt miért ne tanítsuk meg makrózásra? Sok ilyen kérdést fel lehetne tenni az általános/középiskolai tananyagokkal kapcsolatban, csak a legtöbbje valami olyan ismeretanyagot tartalmazna, amit az alaptanterv előír. (Szerintem) Sajnos a "makróírást" nem.

BlackY

Hm, fenejól érzem magam, mert végre hála egy értelmes embernek - neked! - megúsztam egy ocsmány veszekedést, szardobálást, és még az is kiderült hogy szinte teljesen egy véleményen vagyunk! Pedig eleinte úgy tűnt, homlokegyenest más a nézőpontunk! Köszönöm neked!

Makrózást meg tőlem lehetne tanítani nem programozónak készülőknek, de amíg a Wordot is alig tudják megtanulni, a LO-ról nem is beszélve...?

Anno én a programozást JavaScript-ben kezdtem és jobb volt úgy C-re ráállni, mivel hasonló, csak mégis más :) Szóval akár mennyire is nem értesz egyet a script nyelvek igen jók programozás tanulásra.
Különösen jó az "Órlyáskídjónyelv". Sok évig kerülgettem, tavaly kezdtem el komolyabban használni a RaspberyPi-m kapcsán. Azt kell mondjam Zseniális egy nyelv a Python és nem csak oktatásra. Ha programozást kellene kezdenem oktatni, akkor bizony Python nyelven kezdeném el.

> általános iskolában akarják már valahol tanítani

Jól teszik. Info szakos osztályokban alap szinten itthon is tanítják.

> mi szükség van arra, hogy egyre több és több vérpistike legyen,

Például erre, hogy rajtad nevessünk ahogy idegeskedsz.

> ezt a cégek már nem érik fel ésszel?

Sajnos a te zsenialitásod túltesz rajtuk. Akár segíthetnél is nekik!

> vajon miért nincsenek női programozók?

Vannak, jelenleg is több ül körülöttem ahogy szétnézek az irodában.

> Vagy buszsofőrök.

Ideje körülnézned, nap mint nap látok női busz/villamos/metró vezetőket.

> a totális laikusok a programozást

Ahha, te már profi voltál amikor kezdted. Mindenki laikus amikor elkezd valami újat tanulni, nyuszikám.

> A programozók a jelen kor rocksztárjai

Örülök hogy rocksztárnak érzed magad.

* Jól teszik. Info szakos osztályokban alap szinten itthon is tanítják.
Nem tudtam, hogy tanítják, de csámcsogjatok még rajta, hajrá. Mellesleg én is tanultam comlogót, ha az annak számít az király - bár én még mindig jobban örülnék, ha inkább a netes biztonságról, adataink védelméről és egyéb minden számítógépet használó ember számára fontos gyakorlati dolgokról lenne szó, nem olyanról, ami az diákok 90%-át a jövőben nem érinti.

* Vannak, jelenleg is több ül körülöttem ahogy szétnézek az irodában.
Mindenhol vannak kivételek. Azt el lehet ismerni - és a cikkből ki is derül -, hogy ez inkább férfiszakma, mint női, pontosan ugyanannyira, mint a buszvezetés.

* Ahha, te már profi voltál amikor kezdted. Mindenki laikus amikor elkezd valami újat tanulni, nyuszikám.
Laikus -> informatikához laikus.

* Örülök hogy rocksztárnak érzed magad.
Ez sem én állítom, hanem a cikk.

Jó látni, hogy higgadtan és lekezeléstől mentesen sikerült megfogalmazni az írásod.

-------------
"Mérnökkel vitatkozni olyan, mint disznóval birkózni a sárban - kis idő múlva rájössz: Ő ezt élvezi..."
Winben blogja

bár én még mindig jobban örülnék, ha inkább a netes biztonságról, adataink védelméről és egyéb minden számítógépet használó ember számára fontos gyakorlati dolgokról lenne szó, nem olyanról, ami az diákok 90%-át a jövőben nem érinti.

Vagy mondjuk triviális algoritmizálás (for ciklus, elágazás), hogy egyszerűbb makrókat tudjanak készíteni és hatékonyabban tudják jövőbeli munkájukat végezni (pl. JavaScript + LO alapon...), persze ez 5+ osztályban.

BlackY

Nagyon profinak állítod be magad, így joggal merül fel bennem a kérdés, hogy-hogy nem hallottunk eddig rólad?
Érdekelne egy két munkád amit megoszthatnál velünk itt, így legalább elosztathatnád azon kétségeket, miszerint semmitmondó, üres pampogás az, amit csinálsz
(mellesleg megnéztem a blogodat, jópofa és aranyos, idén már megismerkedtél a memcached-el)

// Happy debugging, suckers
#define true (rand() > 10)