Salutations à tous les lecteurs de Habr! Je m'appelle Yuri, j'enseigne les hautes technologies, Oracle, Microsoft et autres depuis plus de 20 ans, ainsi que la création, le développement et le support de systèmes d'information chargés pour divers clients professionnels. Aujourd'hui, je voudrais vous parler de la direction actuelle: des entretiens sur les technologies de traitement des données.
Lors des entrevues d'un tel plan, il est inutile que l'employeur interroge le demandeur sur les technologies liées à la programmation traditionnelle. Par conséquent, je vais généralement vous dire comment vous préparer à une interview dans un seul domaine étroit lié aux langages de traitement de l'information, à savoir le
traitement des entiers longs (arithmétique longue) et l'identification des propriétés d'information des objets du monde réel qui sont décrites en longs entiers.
1. Les entretiens avec des questions sur les technologies de traitement des données sont généralement menés avec un ensemble d'équipes d'analystes et de développeurs qui avaient auparavant une expérience dans le développement de langages déclaratifs, impératifs, orientés objet et fonctionnels.
Défi. Définissez un langage de programmation par un morceau de programme.

Par conséquent, vous devez d'abord vous préparer à la question - qu'est-ce qui est déjà bon dans la langue choisie, qu'est-ce qui pourrait intéresser un employeur potentiel? Soit dit en passant, la liste peut varier d'une version à l'autre, d'une bibliothèque à l'autre, d'une implémentation à l'autre.
Défi. Quelles langues prennent en charge l'arithmétique avec des entiers longs?
As-tu pensé? Exemple de liste:- C, C ++ - bibliothèque libgmp
- Lisp commun - ne limite pas la longueur des entiers
- Erlang - type numérique intégré (entier ())
- Go - tape Int et Rat dans la grande bibliothèque.
- Haskell - Entier Type entier
- Java - classe java.math.BigInteger (février 1997)
- OCaml - bibliothèque num
- Pascal / Delphi - bibliothèque MPArith
- Perl - modules bignum et bigrat
- PHP - module BCMath
- Python - type long intégré (depuis la création du langage, février 1991)
- Rubis - type Bignum
- Scala - classe BigInt
- Schéma - avec R6RS
- Langages .NET - classe System.Numerics.BigInteger (apparu dans le .NET Framework 4.0, il y a presque 10 ans)
2. Si l'employeur a établi une liste à l'avance, il est nécessaire d'isoler les parties communes des langues qui seront discutées lors de l'entretien.
Défi. Quelles sont, selon vous, les langues les plus populaires du point de vue de l'employeur?
Ici vous pouvez voir la réponse basée sur des statistiques.
Dans les systèmes d'information de grande et de très grande taille, un certain nombre d'opérations complètement routinières sont le plus souvent effectuées: tri divers, recherche selon certains critères, algorithmes sur les graphiques, problèmes d'optimisation sur des ensembles de nature différente, tâches de construction d'objets aux propriétés non définies. Mais, en raison de l'ampleur de la tâche, le tri le plus simple peut prendre un mois et la recherche peut prendre une semaine. Une tâche approximative de compréhension.
Défi. À l'extérieur de la fenêtre se trouve un bouleau. Sur celle-ci, comme vos collègues l'ont calculé, 100 000 feuilles, le diamètre du tronc à la racine est de 60 centimètres. Enregistrez les paramètres spécifiés dans n'importe quelle notation mathématique. Et prouver son adéquation: pour la correspondance avec un collègue, car ils veulent couper l'arbre. Ou pour le traitement informatique de son image.
3. Quelques mots sur la partie mathématique. Dans la vie, nous dépassons rarement les limites de l'arithmétique ordinaire. Nos unités utilisent les réalisations de l'algèbre et de l'analyse mathématique. Laissez les énoncés suivants vous aider à vous souvenir, même pas superficiellement, où les connaissances oubliées sont pratiquement utilisées.
Défi. Pourquoi les numéros de téléphone comportent-ils cinq ou six chiffres depuis si longtemps? Étant donné une série de nombres - lequel n'est pas un carré plein? Combien d'autobus dans votre ville ont des nombres carrés complets? Combien de nombres premiers jusqu'à 100 connaissez-vous? Quel est le pourcentage de tous les nombres de 1 à 100? Soit 2, 3, 5, 7 des nombres premiers, trouvez le nombre de nombres premiers jusqu'à 100. Combien d'opérations arithmétiques avez-vous dû faire? Résolvez le même problème sur MS Excel pour l'auto-test de deux manières.
Défi. Comment les renflements et les concavités sont-ils utilisés dans la pratique? Donnez 2-3 exemples d'utilisation de la convexité-concavité.
4. Parfois, il est nécessaire de parcourir la documentation du système / langage / ensemble de bibliothèques, des exemples de descriptions techniques approfondies et étendues de l'auteur / fabricant lui-même. Cela est particulièrement nécessaire si vous avez l'intention d'appeler des bibliothèques non standard.
Défi. Écrivez l'algorithme euclidien étendu dans l'un des langages de programmation indiqués ci-dessus, au paragraphe 1. Dans quelle langue cela ne doit-il pas être fait? Pourquoi?
5. Il est conseillé de comprendre le sens de l'entretien: écrirez-vous vous-même les algorithmes ou devrez-vous maintenir un ensemble d'algorithmes tiers, qui devront éventuellement être mis en ordre?
Défi. Selon l'ensemble des dossiers du médecin chef, réalisés avec un stylo sur le carnet du stagiaire, il est nécessaire d'identifier de manière informatisée à quel patient les rendez-vous ont été pris. Que puis-je conseiller au stagiaire?
6. Si le choix de la langue de l'interview est implicite, il vaut mieux en prendre une plus standardisée afin que l'intervieweur ne veuille pas changer les conditions des tâches pendant la conversation.
Défi. Combien de versions du langage Pascal sont apparues au cours des 25 dernières années? Indiquez les forces et les faiblesses de chaque version.
7. Il est conseillé d'assister à au moins un séminaire sur les algorithmes et leur mise en œuvre dans des solutions d'information toutes faites dans un domaine donné.
Défi. Le poète vous a posé une question: peut-il écrire un poème «Eugene Onegin» en tenant compte du thésaurus poétique de cet auteur. Donnez deux solutions à ce problème.
8. La
ressource pour les programmeurs a pour tâches de former à la capacité de traiter des informations scientifiques et de programmer des algorithmes complexes. Ci-dessous, nous présentons la solution «front», mais elle n'est pas optimale et n'est qu'un énoncé de la condition du point de vue d'un langage de programmation de haut niveau. En raison de la formulation insuffisamment précise du texte de la tâche lui-même, vos réponses peuvent ne pas coïncider avec les réponses données par les auteurs de cette tâche.
Soit
Est le plus petit entier non négatif
pour lequel
a la plus grande valeur possible.
Par exemple
depuis
atteint la valeur maximale
Ă
et a des valeurs plus petites Ă

. Soit
pour
,
.
On sait que
et
. Trouver
.
Défi. Heureusement, il s'agit d'une tâche très rarement résolue au projet Euler. Selon le texte du programme donné, trouvez les forces et les faiblesses de l'algorithme et spécifiez-les. Ce programme peut-il résoudre ce problème en une journée de travail? Comment l'accélérer? Indiquez les erreurs dans la tâche, le cas échéant. Trouvez l'
option "
très grand ". Comment est-il limité?
Encore quelques mots si vous ne pouviez pas le résoudre.Si nous parlions de maxima locaux, alors les réponses devraient être moindres, mais après les calculs, il s'avère soudain que nous parlons de maxima globaux, dont il n'y a pas un mot dans le texte du problème.
Et pourtant, on soupçonne que pour tout . Qui conviendra aux auteurs du problème?
Code pour un exemple de solutionpublic class Start { static BigInteger[] GcdExtended(BigInteger a, BigInteger b) { BigInteger res[] = new BigInteger[3]; if (b == BigInteger.valueOf(0)) { res[0] = a; res[1] = BigInteger.valueOf(1); res[2] = BigInteger.valueOf(0); return res; } res = GcdExtended(b,a.divideAndRemainder(b)[1]); BigInteger s = res[2]; res[2] = res[1].subtract((a.divideAndRemainder(b)[0]).multiply(res[2])); res[1] = s; return res; } public static void main(String[]args) throws IOException { BigInteger i; BigInteger j; int n,n1; BigInteger temp; BigInteger temp1; BigInteger count; FileWriter fileWriter = new FileWriter("c:/temp/terribleanswer.txt"); n1=1; count=BigInteger.ZERO; i=BigInteger.ZERO; j=BigInteger.ZERO; temp1=BigInteger.ZERO; temp=BigInteger.ZERO; for (int a=1;a<19;a++) { for (int b=1;b<1901;b++) { for(n=1;n<;n++) { j=((BigInteger.valueOf(n)).pow(3)); j=j.add(BigInteger.valueOf(b)); i=(((BigInteger.valueOf(n)).add(BigInteger.valueOf(a))).pow(3)); i=i.add(BigInteger.valueOf(b)); int comparevalue = j.compareTo(i); if (comparevalue==0) { temp=GcdExtended(i,j); } else if (comparevalue == 1) { temp=GcdExtended(j,i); } else { temp=GcdExtended(i,j); } int compareTemp = temp.compareTo(temp1); if (compareTemp == 1) { temp1=temp; n1=n; continue; } } String fileContent = a + ";" + b +";"+ temp1 +";"+ n1 + "\n"; temp1=BigInteger.ZERO; count=count.add(BigInteger.valueOf(n1)); n1=1; try { fileWriter.append(fileContent); } catch (IOException e) { } } } String fileContent = count + "\n"; try { fileWriter.append(fileContent); } catch (IOException e) { } fileWriter.close(); } }
9. Je vous souhaite un entretien de bon niveau!
UPD Avant de publier la
version anglaise de l'article , nous donnons quelques éléments non triviaux
ratios trouvĂ©s après une profonde modernisation de la solution ci-dessus. Lors du calcul jusqu'Ă

.
;
;
;
.