Perchè odio Drupal

15 contenuti / 0 new
Ultimo contenuto
Perchè odio Drupal

Mentre aspetto il drupalcamp, ho spulverato qualche video di Drupalcon DC 2009, uno della quale mi ha incuriosito - Why I hate Drupal. Oltre ad essere molto informativo ed anche divertente, mette in rilievo una serie di punti debole sia di codice, sia di organizzazione. Quindi ho scoperto che:

  • Il modulo core Forum è considerato "il peggiore software di Forum mai scritto"
  • il modulo Tassonomia è considerato 'rotto'
  • Il codice (parser di info, XML-RPC) soffre del sindromo del 'non inventato qui' (not invented here NIH)
  • Ci sono mancanza 'grave' nelle API Drupal - per esempio non esiste una funzione per elencare gli utenti
  • Con solo due committers nel core (D6 e D7) e oltre 900 patch fornito, il progetto è tutto forchè un meritocracy

Qualche volta parlare di 'debolezze' fornisce molto più informazione utile che dozzine di relazioni sulla 'bontà' - quindi chiedo a voi cos'è che odi di più di Drupal?

Da parte mia, posso dire che ho trovato parecchie difficoltà nella 'semplice' modifica al form dei moduli per rendere non disinstallabile il modulo specifico per il sito - la struttura del $form è abbastanza complesso, ci sono troppi trappole 'non documentati'. Alla fine mi sembra che questo funziona:

    case 'system_modules': // the modules list form
      // Don't allow disabling
      $form['status']['disabled_modules']['#value']['progetto'] = true;
      $form['status']['#disabled_modules'][] = 'progetto';
      return;

Ma la redondanza mi preoccupa.

Altro esempio era per il Carrello di Ubercart, dove vuolevo 'fissare' la quantità ad uno:

    case 'uc_cart_view_form': // make the quantity field read-only and equal to 1
      $form_items = $form['items'];
      foreach ($form_items as $cart_line => $cart_item) {
        if (is_numeric($cart_line) && isset($cart_item['qty'])) {
          $form['items'][$cart_line]['qty']['#default_value'] = 1;
          $form['items'][$cart_line]['qty']['#value'] = 1; // essential!
          $form['items'][$cart_line]['qty']['#disabled'] = TRUE;
        }
      }
      return;

Prima di 'scoprire' la necessità della riga $form['items'][$cart_line]['qty']['#value'] = 1; ho visto il carrello svuotarsi parecchie volte.
Possibile che devo 'sparare a raffica' o questi strutture di dati (data structures) sono documentati dove io non ho guardato?

Sono tutto in favore di una vita tranquillo, per quello preferisco lavorare con un framework, ma (per il momento) mi sembra che Drupal ha più di una ruota quadrato (vedi il video)...

John

non è orientato ad oggetti ma piuttosto ad eventi, questo è una cosa che non mi piace.
Altra cosa che non mi piace è la modalità di realizzazione dei Moduli, è tutto troppo incasinato, vorrei più "modularità" all'interno di un modulo stesso, ad esempio alcuni specifici Hook_prepocess_*() in file come preprocess.name_module.module .... non so se ho reso l'idea, questa modalità renderebbe i moduli più facile da "leggere" e fare manutenzione.

Slice2Theme Servizio per la conversione di Design in markup HTML e/o temi.

WeBrain Solution | Pillsofbits Of Bits

Penso che tu lo stia vedendo solo dal punto di vista del theming in un approccio non enterprise.
Se ogni pagina potesse avere decine di file che ne modificano il flusso il server passa mezza giornata a giocare a pollicino invece di darti la maledetta pagina!

Uccio wrote:
Penso che tu lo stia vedendo solo dal punto di vista del theming in un approccio non enterprise.
Se ogni pagina potesse avere decine di file che ne modificano il flusso il server passa mezza giornata a giocare a pollicino invece di darti la maledetta pagina!

Si penso che tu abbia ragione, questa volta ho "forato" :D

Slice2Theme Servizio per la conversione di Design in markup HTML e/o temi.

WeBrain Solution | Pillsofbits Of Bits

Comunque al DrupalCamp Mavimo aveva messo un dito su una piaga del 'theming' di Drupal, Ricordi?
Mavimo: 'Chi usa il form API di Drupal?' - metà del gruppo
Mavimo: 'Chi è contento del form presentato nel browser?' - non tanti
Mavimo: 'Chi ha provato modificare il form dal API per migliorare la presentazione nel browser?' - pocchi o nessuno
(Non ho preso appunti, quindi non posso garantire le parole esatte)
Morale della favola? Chi fa theming vuole creare forms 'più belli' ma non è una cosa facile - o almeno è così che ho interpretato il discorso.

John

Più imparo, più dubito.

jhl.verona wrote:
Comunque al DrupalCamp Mavimo aveva messo un dito su una piaga del 'theming' di Drupal, Ricordi?
Mavimo: 'Chi usa il form API di Drupal?' - metà del gruppo
Mavimo: 'Chi è contento del form presentato nel browser?' - non tanti
Mavimo: 'Chi ha provato modificare il form dal API per migliorare la presentazione nel browser?' - pocchi o nessuno
(Non ho preso appunti, quindi non posso garantire le parole esatte)
Morale della favola? Chi fa theming vuole creare forms 'più belli' ma non è una cosa facile - o almeno è così che ho interpretato il discorso.

John


Io penso che nel Talk sul theming quando si è cominciati a parlare sulla questione Form che è stato l'argomento più caldo di quel talk ho intravisto un paio di considerazioni:

Da un lato avevamo le aziende che com'è immaginabile "chiedono" al grafico di disegnare qualcosa ed il programmatore o il themer dovrà provvedere a renderlo possibile, però ci si scontra in questo caso con l'anatomia di Drupal che nel caso dei FORM è più marcata che in altre sue componenti, probabilmente data la loro delicatezza. Infatti i Form sono soggetti ad attacchi, i form vengono utulizzati per il passagio di variabili... ecc in quest'ottica se ne comprende la loro complessità e la difficoltà nel renderli più elastici possibili e allo stesso tempo temizzabili facilmente.

Dall'altro lato abbiamo i grafici che molto spesso creano Form dalle forme particolari o dall'aspetto particolare, magari più usabili o semplicemente in linea con la grafica del sito...

I form non sono soltanto codice HTML stampato e temizzato, essi devono ricevere delle variabili, hanno molti attributi, spesso allocano delle variabili e personalmente mi sembra di capire che il Team di Drupal abbia dato più importanza al loro funzionamento generale e il loro utilizzo, ed in secondo luogo ne hanno progettato una loro possibile temizazzione, forse scavando nel loro utilizzo a piccoli passi si potrebbe renderli più usabili rispetto ad oggi.

Slice2Theme Servizio per la conversione di Design in markup HTML e/o temi.

WeBrain Solution | Pillsofbits Of Bits

beh prima di lamentarvi dei form di Drupal, provate quelli di Zend! :D

@jhl.verona: si grossomodo il discorso era quello, ma non ho capito bene (o per lo meno spero di non aver capito) se il problema è dato dal fatto che alla fne ci si accontenta o non si vuole fare un investimento nel trovare il modo di modificarlo. Alla fine una volat imparato il meccanismo non è complesso, più essere noioso, sembrare antimpatico, ma di certo non meno di altri sistemi. Personalmente ODIO strumenti in cui sono costretto a scrivere

<form action="..." ... >
  <input type="..." value="...">
  <select>
  <?php foreach($options as $key => $value): ?>
    <option value="<?php print $key; ?>"><?php print $value; ?></option>
  <?php endeach; ?>
  </select>
</form>

e così via.. per non parlare del lato security (qui si apre un mondo).
Come diceva correttamente kiuz la granularità dei file rende il tutto più bello ma meno performante (si, poi caon APC & c si può fare qualche cosa), in ogni caso alcune cose sono già fruibili, per esempio le inclusioni nelle pagine del menu, sopratutto per quelle parti (tipo i form di amministraizione) che occupano un sacco di spazio (come testo e quindi una volta caricati in ram), oppure le parte di theming (i TPL, o le parte con i famosi preprocess_*) ma anche le parti relative alle views, le classi da importare usate solo in alcune occasioni, ...
Ovviamente si tratta di ottimizzazioni "spinte".

Una cosa che non apprezzo al 100% di Drupal? Tutto e nulla, a volta il debugging è un pò incasinato, essendo ad eventi è abbastanza semplice seguirne il flusso, ma al contempo quandotrovi un erroe risalire a dove è partito è bloccante. E' procedurale e non ad oggetti (per lo meno non nel senso stretto del termine) e per alcuni è un difetto, sotto altri aspetti un pregio (omissis/silent akl camp l'ha dichairato apertamente nella sua lotta al PDO).

Poi ovviamente come tutti gli strumenti ha diverse pecche e punti a suo favore, ma un volta che lo si conosce si sa anche dove andare a parare..

Ciao
Marco
--
My blog
Working at @agavee

Gli oggetti sono il male! Scherzi a parte, trovo che l' object orientation venga considerata come la panacea ai mali della programmazione, il che mi fa accapponare la pelle vedendo poi come la gente la usa. Programmare ad oggetti NON vuol dire saper programmare, cosi come chi sostiene che "si programma ad oggetti perche' e' cosi che si fa" molto spesso sta parlando a vanvera e dimostra semplicemente la sottomissione ad un dogma. La programmazione a oggetti va utilizzata quando serve, non a prescindere dal contesto e SOPRATTUTTO se la si sa usare, ricordando che il suo principale scopo e' quello di fornire uno strumento di modellazione dei problemi che ricalchi piu' da vicino il mondo reale.
Vi faccio un esempio che mi sono trovato pochi giorni fa davanti ricontrollando codice che mi ha fatto rizzare i capelli:

<?php
class Goom_Mail_Client {
    protected
$_mail;
    public function
__construct($bounce, $name) {
       
Zend_Mail::setDefaultTransport(new Zend_Mail_Transport_Sendmail('-f ' . $bounce));
       
$this->_mail = new Zend_Mail('utf-8');
       
$this->_mail->setFrom($bounce, $name);
    }
    protected function
setMail(Zend_Mail $mail) {
       
$this->_mail = $mail;
        return
$this;
    }
    protected function
getMail() {
        return
$this->_mail;
    }
    public function
addTo($email, $name) {
       
$this->_mail->addTo($email, $name);
        return
$this;
    }
    public function
addBcc($email, $name) {
       
$this->_mail->addBcc($email, $name);
        return
$this;
    }
    public function
setSubject($subject) {
       
$this->_mail->setSubject($subject);
        return
$this;
    }
    public function
setBody($text, $html = null) {
        if (isset(
$html)) {
           
$this->_mail->setBodyHtml($html);
        }
       
$this->_mail->setBodyText($text);
        return
$this;
    }
    public function
send() {
       
$this->_mail->send();
    }
}
 
?>

Questo e' un esempio di cosa voglia dire non capire il significato dell' object orientation: la classe e' assolutamente inutile in quanto non aggiunge nulla alla classe istanziata nel costruttore ed e' stata messa li' solo per avere una classe chiamata Goom_Mail anziche' Zend_Mail. Risultato: codice inutile, piu' lento e maggiormente esposto alla possibilita' di bug.
Per rispondere invece a kiuz riguardo il commento (Oggetti > Eventi): uno non esclude l'altro e l'utilizzo degli eventi talvolta e' fondamentale per gestire con potenza ed eleganza situazioni complesse che altrimenti sarebbero gestibili in maniera veramente difficile.
Un esempio JS: hai il tuo sito con un quadrilione di pagine e ti interessa fare in modo che quando l'utente lascia una pagina vengano eseguiti alcuni metodi. Una soluzione elegante e' quella di avere un gestore di eventi nel qual puoi registrarli e farli eseguire nel momento in cui quel determinato evento capita, in questo caso il cambio di pagina. Questo approccio ti evita, per esempio, di non dover mettere in ogni pagina un pezzo di codice che implementi tutta questa logica.
Scusate per il megapippone :P

tra le altre cose mi piacerebbe vedere un server che gioca a pollicino o.o

Guarda, mi trovo d'accordo con te (in parte), la classe poteva benissimo ereditare la classe padre (anzichè istanziarla al suo interno) e fare l'verride di quelle due funzioni che servono (__construct e setBody) detto questo, però, è anche vero che una programmazione solamente procedurale complica la gestione e manutenzione, quindi deve esserci un gisuto compromesso che permette di usare l'una o l'altra forma.

Sabato c'è stata una ottima conferenza a Milano (faccio un pò di pubblicità all'UGI Alt.NET, ma la conferenza era verametne di buon livello e molto Alt), in cui durante uno speech sul DDD si è parlato anche del fatto ceh la OOP è un buon strumento se usato come è stato usato inizialmente, mentre ormai non è altro che un modo per dire "io programmo figo" il che non è assolutamente buono.

Detto questo ritengo che la OOP sia comunque un buon modo di programmare SE usato con la testa e con le potenzialità che questo offre e non solo perché "la moda vuole questo".

Ciao
Marco
--
My blog
Working at @agavee

Nella mia piccola esperienza, ho visto che per un linguaggio che conosco, posso capire un framework in 2-4 settimane, diventare pericoloso in altri 2-3 settimane, ed arrivare a fare qualcosa di utile (e con meno danni) in circa 3 mesi. Allora non sapevo (e ancora non so) PHP, ma C, C++, Java e Ruby si. Ma dopo 6 mesi di 'solido' uso, non mi sento ancora ad aggio.
Ci possono esseretre motivi; Drupal è complesso e quindi difficile da imparare in tempi brevi, mi trovo sempre ad affrontare problemi emarginati (edge-cases), o sono fin troppo capace di compicare affari semplice. Probabilmente un misto di tutti i tre, soprattutto l'ultimo.
Quello che mi manca (e credimi, ho letto un pò di libri) sono le modelli. Come processa una richiesta? Cos'è la struttura dati di un form? E cosi via.

silent wrote:
Gli oggetti sono il male! Scherzi a parte, trovo che l' object orientation venga considerata come la panacea ai mali della programmazione, il che mi fa accapponare la pelle vedendo poi come la gente la usa. Programmare ad oggetti NON vuol dire saper programmare, cosi come chi sostiene che "si programma ad oggetti perche' e' cosi che si fa" molto spesso sta parlando a vanvera e dimostra semplicemente la sottomissione ad un dogma. La programmazione a oggetti va utilizzata quando serve, non a prescindere dal contesto e SOPRATTUTTO se la si sa usare, ricordando che il suo principale scopo e' quello di fornire uno strumento di modellazione dei problemi che ricalchi piu' da vicino il mondo reale.

Credo che ormai nessuno crede più che OOP sia il proiettile d'argento (silver bullet). E perfettamente possibile per un programmatore scrivere un buon programma in un brutto linguaggio di programmazione, ma molto più probabile l'inverso.
silent wrote:
Questo e' un esempio di cosa voglia dire non capire il significato dell' object orientation: la classe e' assolutamente inutile in quanto non aggiunge nulla alla classe istanziata nel costruttore ed e' stata messa li' solo per avere una classe chiamata Goom_Mail anziche' Zend_Mail. Risultato: codice inutile, piu' lento e maggiormente esposto alla possibilita' di bug.

Ma anche in Java o C++ o Ruby, et al. Ma se il software-house usa il meccanismo di premii per più codice scritto - è ottimale!
silent wrote:
...Un esempio JS: hai il tuo sito con un quadrilione di pagine e ti interessa fare in modo che quando l'utente lascia una pagina vengano eseguiti alcuni metodi. Una soluzione elegante e' quella di avere un gestore di eventi nel qual puoi registrarli e farli eseguire nel momento in cui quel determinato evento capita, in questo caso il cambio di pagina. Questo approccio ti evita, per esempio, di non dover mettere in ogni pagina un pezzo di codice che implementi tutta questa logica.

Vero, ma ci vuoleva un Crockford, e librerie come Prototype e jQuery prima che ci siamo resi conto che è un linguaggio potente, versatile, e compatto. E che ha closures, ed altre belle cose che permettono l'uso di cosi poco codice...

Per finire, vedo qui ed altrove dei nuovi arrivati, dei medi (io, per esempio) e dei esperti. Inizio a pensare che gli esperti non spiegano questi modelli a noi (che io desidero cosi tanto) perchè hanno impiegati cosi tanto tempo a capirli, e che ci vorrebbe fiumi d'inchiostro per spiegarli...
Proviamo a remediare con la campagnia documentazione 2010 qui su di.o 8-)

Più imparo, più dubito.

@jhl.verona; per la campagna di documentazione più che volentieri e che ne dite di un sprint doc :)

Per quanto mi riguarda cerco di spiegare quanto posso (quello che so) ma ci sono diversi problemi nel farlo:

  1. Il tempo (sembra una banalità e/o una scusa, ma purtroppo non è così)
  2. Il modo di spiegarsi. Per quanto scrivere renda il tutto chiaro non è affatto semplice per me riuscire a spiegare quello che vorrei, sia perchè ogniuno ha un suo processo mentale e quindi la mia spiegazione potrebbe essere contorta per altri, che perché servirebbe un enorme lavoro di revisione su quanto detto (e qui colpa mia, scrivo abbastanza di getto e di rado torno su quanto scritto).

Questo non tanto per giustificarmi ma per indicare quali possibili problemi ci sono nello scrivere documenti.. per non parlare poi delle persone che ritengono che non spiegare ad altri sia la cosa migliore perchè gli permette di mantenere la loro competitività (lasciamo perdere che è meglio).

Tornando sull'argomento della discussione (che ormai ho perso) io non butterei via OOP & c. ma cerchierei di capire in che casi può essere usato? Per esempio, le views sono strumenti decisamente basati su OOP, qualcuno li ritieni strumenti non usabili & gestibili?
Semplicemente sono realizzati come dovrebbe essere e sono scritti da persone che ne capiscono parecchio, quindi sono riusciti a realizzare uno strumento usabile.

Ciao
Marco
--
My blog
Working at @agavee

mavimo wrote:
@jhl.verona; per la campagna di documentazione più che volentieri e che ne dite di un sprint doc :)

Si - questo abbiamo già iniziato (io autore, Psicomante/sylpheed editori). Vorrei tanto descrivere il 'pezzo' fra il menu router (già scritto) e la tema - ma non l'ho (ancora) capito! E pensavo di lasciare a kiuz la tema (delegazione? beh lui sa molto di più di me sul argomento - io mi sono fermato sui 'componenti').

mavimo wrote:
Per quanto mi riguarda cerco di spiegare quanto posso (quello che so) ma ci sono diversi problemi nel farlo:
...
Questo non tanto per giustificarmi ma per indicare quali possibili problemi ci sono nello scrivere documenti.. per non parlare poi delle persone che ritengono che non spiegare ad altri sia la cosa migliore perchè gli permette di mantenere la loro competitività (lasciamo perdere che è meglio).

Meglio scritto male ma spiegando correttamente, che cavolate scritti bene. Della seconda categoria ne ho trovato (altrove s'intende) quanti ne vuoi... Per quello mi permetto di scrivere documentazione qui; qualcuno può sempre correggere errori di grammatica e sintasse, ma anche le cavolate!

mavimo wrote:
Tornando sull'argomento della discussione (che ormai ho perso) io non butterei via OOP & c. ma cerchierei di capire in che casi può essere usato? Per esempio, le views sono strumenti decisamente basati su OOP, qualcuno li ritieni strumenti non usabili & gestibili?
Semplicemente sono realizzati come dovrebbe essere e sono scritti da persone che ne capiscono parecchio, quindi sono riusciti a realizzare uno strumento usabile.

Spero di non essere frainteso - non sono contro OOP anzi... Ma non è una panacea a tutti i mali. Qualche volta ho dovuto 'spacchettare' un metodo perchè mi serviva qualche pezzo di code per un classe ereditato. Va bene se lo faccio con il mio codice, un pò meno con una librerie da altri (Don't hack modules libraries!)
E sono in accordo per OOP in Views anche dal poco codice che ho letto. Lo considero un buon esempio di codice OOP in PHP.

Allora se dopo 6 mesi posso dire che ho capito il menu router, e forse ho capito abbastanza bene la tema (anche se Views aggiunge un bel pò di nebbia) ho questa grande zona grigio in mezzo. Per esempio, Drupal prima crea i dati poi manda alla tema, ma se c'è una lista di nodi, come posso 'passare' la lista - o il suo lunghezza - a node.tpl.php? Ho capito che genera/temizza(!) i pezzi prima, cioè node, links, et al., prima di chiamare page. E i blocchi? Stesso processo? Sempre fra dati e pagina, prima o dopo node?, ecc. Leggerò voluntieri il codice, ma dove iniziare? - ci sono 3 MB (7 MB in D7), e io ho una certa età!
[Edit] E' non sono l'unico: http://stackoverflow.com/questions/1068556/how-drupal-works [/Edit]

Ma tornando al discorso originale, forse quello che odio ancora, e che per risolvere in 10 minuti caduno di quei piccoli problemi - certi delle quale ho già spiegato in questo sito) ci impiego 10 si, ma di ore (circa). Adesso posso crearmi un nuovo sandbox in 5 minuti, cck e views compresso (grazie Drush), ma per il resto, nuoto nel fango! E non sto diventando più giovane!

John

Più imparo, più dubito.

mavimo wrote:
Guarda, mi trovo d'accordo con te (in parte), la classe poteva benissimo ereditare la classe padre (anzichè istanziarla al suo interno) e fare l'verride di quelle due funzioni che servono (__construct e setBody) detto questo, però, è anche vero che una programmazione solamente procedurale complica la gestione e manutenzione, quindi deve esserci un gisuto compromesso che permette di usare l'una o l'altra forma.

Ma infatti non ho detto che l' object orientation sia il male(ok l'ho detto, ma era una provocazione fatta con ironia :D), dico solo che secondo me molte volte e' sopravvalutata e mal utilizzata, e ancor piu' spesso e' equiparata al "saper programmare". Inoltre penso che date le funzionalita' che offre php, molto spesso usare gli oggetti sia completamente superfluo, specialmente se si utilizzano dei buoni costrutti e un minimo di criterio. Cio' non toglie che ci siano contesti in cui usare il paradigma ad oggetti sia decisamente piu' vantaggioso e che l' oo offra degli innegabili vantaggi, ma personalmente cerco prima di avere una strutturazione logica e del codice e POI di usare l' oo se penso che sia necessaria e/o vantaggiosa.
Per quanto riguarda la classe che ho citato poi, e' completamente sbagliata al punto da poter essere annoverata come anti-pattern(mi ricorda ababstanza da vicino questo: http://en.wikipedia.org/wiki/Call_super), in quanto setBody non aggiunge alcun tipo di valore alle funzionalita' fornite dalla classe e il costruttore nemmeno, per cui la mole di codice in questo caso non e' giustificata dal fine. Oltretutto setBody introduce una logica che e' arbitraria rispetto alla classe mail che e' gia' dotata di metodi per fare quelle cose. Insomma, non vale proprio la pena aggiungere un metodo allo stack delle chiamate piu' una struttra di controllo if in quel caso, sono cicli di cpu sprecati.

mavimo wrote:
Detto questo ritengo che la OOP sia comunque un buon modo di programmare SE usato con la testa e con le potenzialità che questo offre e non solo perché "la moda vuole questo".

Assolutamente d' accordo.