Wow, il y a beaucoup de choses ici dont je ne savais même pas qu'il s'agissait de limitations - après avoir travaillé sur la plate-forme pendant quelques années.
Mais juste pour ajouter d'autres choses ...
La raison pour laquelle vous n'avez pas de débogueur ligne par ligne est précisément parce qu'il s'agit d'une plate-forme multi-tenant. Du moins, c'est ce que dit SFDC - il semble qu'à l'ère de la programmation riche en threads, ce n'est pas vraiment une excuse, mais c'est apparemment la raison. Si vous devez écrire du code, vous avez "System.debug (String)" comme débogueur - je me souviens avoir eu des outils de débogage de serveur plus sophistiqués dans Java 1.2 il y a environ 12 ans.
Une autre chose que je déteste vraiment dans le système est le contrôle de version. Le framework Spring n'est pas utilisé pour ce à quoi Spring est généralement utilisé - il s'agit vraiment plus d'un outil de configuration dans SFDC que d'un contrôle de version. SFDC fournit un contrôle de version ZERO.
Vous pouvez vous retrouver coincé pendant des jours à faire quelque chose qui semble ridiculement facile, comme, par exemple, la planification d'un rapport SFDC à exporter vers un fichier CSV et à envoyer par courrier électronique à une liste de destinataires ... Eh bien, le moyen le plus simple de le faire est créer un objet personnalisé avec un champ personnalisé, avec une règle de workflow et un modèle de courrier électronique Visualforce ... puis pour le code, vous devez écrire un composant Visualforce qui transmet les données du rapport au modèle de courrier électronique Visualforce en tant que pièce jointe et vous écrivez APEX anonyme calendrier de code - mise à jour du champ de l'objet personnalisé ... Pour les développeurs SFDC, c'est presque une tâche quotidienne ... essayer de rassembler environ cinq technologies différentes pour faire des tâches qui semblent si simples ... Et cela peut causer des maux de tête de gestion et les tensions aussi - En règle générale, vous le découvrirez après avoir reçu une suggestion de faire quelque chose qui ne fonctionne past travailler dans la communauté des utilisateurs (comme quelqu'un l'a déjà dit), puis essayer beaucoup de choses qui, après les avoir développées, vous trouveriez qu'elles ne fonctionnent tout simplement pas pour une raison étrange - comme "vous ne pouvez pas planifier un Page VisualForce ", ou" vous ne pouvez pas appeler getContent à partir d'un contexte planifiable "ou pour une autre raison obscure.
Il y a tellement, beaucoup de petits pièges exaspérants sur la plate-forme SFDC, qu'une fois que vous savez POURQUOI ils sont là, cela a du sens ... mais ce sont encore de très mauvaises limitations qui vous empêchent de faire ce que vous devez faire. Voici quelques-uns des miens;
Vous ne pouvez pas obtenir des informations sur le propriétaire de l'enregistrement «prêtes à l'emploi» sur à peu près n'importe quel type d'enregistrement - vous devez écrire un déclencheur qui lie le propriétaire lors de la création de l'enregistrement à l'enregistrement que vous insérez. Pourquoi? Réponse courte car un propriétaire peut être soit une "personne", soit une "file d'attente", et les deux sont des entités radicalement différentes ... Cela a du sens, mais cela peut littéralement bouleverser un projet.
Modèle de sécurité exaspérant. Exemple: l'autorisation "Gérer les rapports publics" est très différente de "Créer et personnaliser des rapports" et cela vaut essentiellement pour tout sur la plate-forme ... en particulier les dossiers de tout type.
Comme mentionné, le support est pratiquement inexistant. Si vous êtes un individu extrêmement autonome, ou avez beaucoup de ressources SFDC, ou avez beaucoup de temps et / ou un gestionnaire très indulgent, ou êtes en charge d'un système SFDC qui fonctionne bien, vous êtes plutôt bien forme. Si vous n'êtes dans aucune de ces positions, vous pouvez vous retrouver dans de graves problèmes.
SFDC est une proposition commerciale très séduisante ... pas d'empreinte d'équipement, assez bonne sécurité, prix fixe, pas d'infrastructure, ET vous obtenez un CRM basé sur le Web avec un traitement par lots et programmé ... Mais comme l'ont dit les autres affiches, c'est vraiment une augmentation considérable de l'apprentissage du développement, et si vous optez pour le conseil, je pense que le prix le plus bas que j'ai vu était de 200 $ l'heure.
Salesforce a tendance à s'intégrer à d'autres choses des années après que certaines technologies soient devenues courantes - JSON et jquery viennent à l'esprit ... et si vous avez d'autres infrastructures communes avec lesquelles vous souhaitez faire une intégration, comme JIRA, attendez-vous à payer beaucoup plus, et ils peuvent être assez bogués.
Et comme l'une des autres affiches mentionnées, vous vous battez constamment contre les limites du gouverneur qui peuvent simplement vous rendre fou ... une pièce jointe ne peut PAS être> 5 Mo. Période. Et parfois <3 Mo (si encodé en base64). Dix appels HTTP dans une classe. Période. Il existe des dizaines de limites de gouverneur publiées, et beaucoup d'autres ne le sont pas que vous trouverez sans aucun doute et que vous voudrez simplement quitter votre bureau en hurlant.
J'aime vraiment, VRAIMENT la plate-forme, mais croyez-moi - cela peut être une maîtresse vraiment cruelle.
Mais pour être juste envers SFDC, je dirais ceci: le plus gros problème que je trouve avec la plate-forme n'est pas la plate-forme elle-même, mais les attentes gargantuesques de presque quiconque voit la plate-forme, mais ne s'y développe pas ... et ces personnes ont tendance à occuper des postes de grande autorité dans les organisations commerciales; marketing, ventes, gestion, etc. ils ne le font pas et ne le feront pas.
EDIT:
Juste pour ajouter aux commentaires de lomaxx sur le MVC; Dans la terminologie SFDC, ceci est étroitement lié à ce que l'on appelle le "état d'affichage" - et cela peut être vraiment bogué, en ce que ce qui est sur la page VF n'est pas ce qui est dans la classe contrôleur de la page. Donc, vous devez passer par des girations étranges pour synchroniser ce qui se trouve sur la page avec ce que le contrôleur va écrire à SF lorsque vous cliquez sur votre bouton "Enregistrer" (ou faites votre appel HTTP ou autre) ... mec, c'est ennuyeux .