Fatti:
Fatti:
A. Nell'ambito di un controllo dei datori di lavoro esperito in data 23 ottobre 2002, la Cassa di compensazione del Cantone Ticino ha rilevato che negli anni sottoposti a verifica (1998-2001) lo studio d'ingegneria X._ SA aveva corrisposto retribuzioni per un ammontare totale di fr. 179'699.- (fr. 201'931.- ./. fr. 22'232.-), sulle quali non erano stati prelevati i contributi AVS/AI/IPG/AD e AF.

Considerando l'importo in discussione come provento di attività lucrativa dipendente, la Cassa, con decisione 29 ottobre 2002, ha preteso dalla ditta interessata il pagamento dei contributi paritetici arretrati per complessivi fr. 30'830.40.
Con atti di medesima data, l'amministrazione ha provveduto a notificare tale decisione pure agli interessati B._ e M._.
Con atti di medesima data, l'amministrazione ha provveduto a notificare tale decisione pure agli interessati B._ e M._.
B. Lo studio d'ingegneria X._, patrocinato dall'avv. Renata Loss Campana, è insorto contro il provvedimento con ricorso al Tribunale delle assicurazioni del Cantone Ticino, adducendo in sostanza che le retribuzioni versate ad B._ e a M._ dovevano essere considerate come proventi da attività indipendente.
Per giudizio 11 giugno 2003 i primi giudici, dopo aver proceduto ad accertamenti completivi, hanno parzialmente accolto il ricorso. Essi hanno ritenuto che la retribuzione di fr. 10'000.- percepita da M._ non doveva essere ripresa, in quanto si era trattato di un unico mandato e di un onorario comunque ridotto, mentre gli onorari versati dalla società tra il 1998 e il 2000 ad B._ per complessivi fr. 147'368.-, essendo predominanti rispetto a quelli conseguiti da quest'ultimo con l'attività da indipendente, andavano considerati come salario determinante.
Per giudizio 11 giugno 2003 i primi giudici, dopo aver proceduto ad accertamenti completivi, hanno parzialmente accolto il ricorso. Essi hanno ritenuto che la retribuzione di fr. 10'000.- percepita da M._ non doveva essere ripresa, in quanto si era trattato di un unico mandato e di un onorario comunque ridotto, mentre gli onorari versati dalla società tra il 1998 e il 2000 ad B._ per complessivi fr. 147'368.-, essendo predominanti rispetto a quelli conseguiti da quest'ultimo con l'attività da indipendente, andavano considerati come salario determinante.
C. Sempre assistito dall'avv. Loss Campana, lo studio d'ingegneria X._ interpone ricorso di diritto amministrativo al Tribunale federale delle assicurazioni, al quale chiede l'annullamento della pronuncia cantonale e della decisione amministrativa impugnata per quanto riferite al prelievo di contributi di diritto federale per B._. Dei motivi si dirà, in quanto necessario, nei considerandi.
La Cassa propone la reiezione del gravame, mentre l'Ufficio federale delle assicurazioni sociali ha rinunciato a determinarsi.
Invitato ad esprimersi quale cointeressato, B._ rileva di essere rimasto libero di accettare e rifiutare i mandati proposti dallo studio d'ingegneria ricorrente, soggiungendo che i rimborsi spese percepiti erano riferiti ad acquisti eseguiti per conto della ditta, e non per espletare i mandati affidatigli.
Diritto:
Diritto:
1. La legge federale sulla parte generale del diritto delle assicurazioni sociali (LPGA) del 6 ottobre 2000, entrata in vigore il 1° gennaio 2003, ha modificato numerose disposizioni in materia d'assicurazione per la vecchiaia e per i superstiti. Ciò nonostante, il caso di specie è disciplinato dalle norme in vigore fino al 31 dicembre 2002, avuto riguardo al principio secondo cui le regole applicabili sono quelle vigenti nel momento in cui si sono verificati i fatti giuridicamente determinanti (<ref-ruling> consid. 1.2, 398 consid. 1.1, 127 V 467 consid. 1).
1. La legge federale sulla parte generale del diritto delle assicurazioni sociali (LPGA) del 6 ottobre 2000, entrata in vigore il 1° gennaio 2003, ha modificato numerose disposizioni in materia d'assicurazione per la vecchiaia e per i superstiti. Ciò nonostante, il caso di specie è disciplinato dalle norme in vigore fino al 31 dicembre 2002, avuto riguardo al principio secondo cui le regole applicabili sono quelle vigenti nel momento in cui si sono verificati i fatti giuridicamente determinanti (<ref-ruling> consid. 1.2, 398 consid. 1.1, 127 V 467 consid. 1).
2. 2.1 La presente vertenza concerne la determinazione e la pretesa di contributi paritetici e non già l'assegnazione o il rifiuto di prestazioni assicurative. Il Tribunale federale delle assicurazioni deve pertanto limitarsi ad esaminare se il giudizio di primo grado abbia violato il diritto federale, compreso l'eccesso o l'abuso del potere d'apprezzamento, oppure se l'accertamento dei fatti sia manifestamente inesatto, incompleto o avvenuto violando norme essenziali di procedura (art. 132 OG in relazione con gli art. 104 lett. a e b e 105 cpv. 2 OG).
D'altra parte, essendo controverse contribuzioni pubbliche, questa Corte non è vincolata dalle conclusioni delle parti (art. 114 cpv. 1 OG).
2.2 La decisione amministrativa in lite ha per oggetto anche la richiesta di contributi per assegni familiari (AF). Ora, per quel che riguarda questi ultimi, essi attengono alla legislazione cantonale, per cui sfuggono al controllo giudiziale del Tribunale federale delle assicurazioni, il quale è legittimato a statuire unicamente circa gli oneri di diritto federale (<ref-ruling> consid. 1). Nella misura in cui sia suscettibile di riguardare simili contributi, il ricorso di diritto amministrativo è quindi irricevibile.
2.2 La decisione amministrativa in lite ha per oggetto anche la richiesta di contributi per assegni familiari (AF). Ora, per quel che riguarda questi ultimi, essi attengono alla legislazione cantonale, per cui sfuggono al controllo giudiziale del Tribunale federale delle assicurazioni, il quale è legittimato a statuire unicamente circa gli oneri di diritto federale (<ref-ruling> consid. 1). Nella misura in cui sia suscettibile di riguardare simili contributi, il ricorso di diritto amministrativo è quindi irricevibile.
3. 3.1 Oggetto della vertenza è il tema di sapere se la retribuzione per complessivi fr. 147'368.-, percepita da B._ nel periodo dal 1998 al 2000 per l'attività svolta per lo studio d'ingegneria X._, sia da considerare quale provento da attività lucrativa dipendente o indipendente.
3.2 Nei considerandi del querelato giudizio, cui si rinvia, la Corte cantonale ha già correttamente esposto che in materia di AVS l'obbligo contributivo di persone esercitanti un'attività lucrativa dipende, tra l'altro, dal reddito da esse realizzato durante un determinato periodo di tempo con attività dipendente o indipendente (art. 5 e 9 LAVS, art. 6 segg. OAVS). Secondo l'<ref-law> il salario determinante comprende qualsiasi retribuzione del lavoro a dipendenza d'altri per un tempo determinato o indeterminato. Per l'<ref-law> il reddito proveniente da un'attività lucrativa indipendente "comprende qualsiasi reddito che non sia mercede per lavoro a dipendenza d'altri".
Per quanto concerne la qualifica dell'attività esercitata da un assicurato, il Tribunale federale delle assicurazioni ha precisato che gli accordi, le dichiarazioni delle parti, la natura dal profilo del diritto civile del contratto vincolante un assicurato a un datore di lavoro non costituiscono, in materia di AVS, elementi decisivi per stabilire se una persona eserciti un'attività lucrativa a titolo dipendente o indipendente.
Di principio si deve ammettere un'attività dipendente secondo l'<ref-law> quando una delle parti, rispetto all'altra, è subordinata per quanto concerne l'impiego del tempo o l'organizzazione del lavoro e non sopporta il rischio economico a carico del datore di lavoro.
Questi principi non comportano comunque, da soli, soluzioni uniformi. Le manifestazioni della vita economica infatti possono assumere forme diverse e impreviste, così che è necessario lasciare alla prassi delle autorità amministrative e alla prudenza dei giudici il compito di stabilire in ogni caso particolare se ci si trovi di fronte ad attività indipendente o dipendente. La decisione sarà determinata generalmente dalla priorità di certi elementi, quali il rapporto di subordinazione o il rischio sopportato rispetto ad altri che militano in favore di soluzioni diverse (<ref-ruling> consid. 1, 122 V 171 consid. 3a, 283 consid. 2a, 119 V 161 consid. 2 e la giurisprudenza ivi citata).
Questi principi non comportano comunque, da soli, soluzioni uniformi. Le manifestazioni della vita economica infatti possono assumere forme diverse e impreviste, così che è necessario lasciare alla prassi delle autorità amministrative e alla prudenza dei giudici il compito di stabilire in ogni caso particolare se ci si trovi di fronte ad attività indipendente o dipendente. La decisione sarà determinata generalmente dalla priorità di certi elementi, quali il rapporto di subordinazione o il rischio sopportato rispetto ad altri che militano in favore di soluzioni diverse (<ref-ruling> consid. 1, 122 V 171 consid. 3a, 283 consid. 2a, 119 V 161 consid. 2 e la giurisprudenza ivi citata).
4. 4.1 Nel caso in esame, la Cassa ha proceduto alla ripresa di salari non notificati, in quanto ha ritenuto che dai conteggi mensili inviati da B._ allo studio d'ingegneria X._ SA risultasse chiaramente trattarsi di elementi tipici di un salario, tanto più che l'interessato fatturava sia le spese di trasferta che le diverse spese sostenute per la ditta. L'amministrazione ha pure precisato che non aveva alcuna importanza il fatto che B._ fosse affiliato all'AVS quale indipendente, avendo l'affiliazione per scopo di assicurare una persona che esercita un'attività lucrativa e non già di qualificarne definitivamente lo stato professionale, ritenuto che non poteva essere escluso a priori che un assicurato qualificato come indipendente esercitasse un'attività di natura dipendente.
4.2 Il ricorrente contesta questo apprezzamento. Critica in primo luogo, con riferimento al principio della buona fede, il fatto che la Cassa abbia sostenuto che l'affiliazione di una persona quale indipendente non avrebbe valenza probatoria per la qualifica dello stato professionale. Simile comportamento non garantirebbe alcuna protezione a chi dà fede a questa conferma e si comporta e accorda di conseguenza in merito alla rimunerazione. La ditta insorgente precisa inoltre che B._ occupava locali professionali propri, assumendosi le relative spese di locazione. Egli sopportava interamente le spese d'esercizio, ad eccezione delle spese di trasferta per i lavori svolti su incarico dello studio ricorrente. Era poi tassato dall'autorità fiscale quale indipendente e non godeva di alcuna agevolazione o facilitazione nell'incasso delle proprie pretese, nel senso che riceveva il medesimo trattamento degli altri creditori, sopportando pertanto un rischio imprenditoriale. Il ricorrente soggiunge ancora che B._ non era in nessun modo in rapporto di subordinazione nei suoi confronti ed era libero di accettare o rifiutare i mandati offertigli. Inoltre, l'interessato aveva anche altri clienti al di fuori dello studio X._. Oltre ad assumersi tutte le spese generali della propria attività, egli pagava pure la propria assicurazione responsabilità civile, ciò che avrebbe determinato un rischio imprenditoriale qualora non avesse avuto sufficiente lavoro per farvi fronte.
Il ricorrente afferma altresì che B._ svolgeva parte delle sue prestazioni lavorative presso il proprio studio, parte presso lo studio d'ingegneria X._ SA. A dipendenza di dove si trovasse, egli utilizzava gli strumenti di lavoro in loco, fatto questo da cui non è lecito dedurre che si sia in presenza di una dipendenza dalle infrastrutture sul luogo di lavoro, come sostenuto dai primi giudici, né tanto meno può darsi dipendenza per il fatto che la ditta fosse un grosso cliente per B._. L'insorgente conclude precisando che sarebbero state fatturate unicamente le spese di trasferta, mentre per le altre spese si tratterebbe di acquisti effettuati per conto dello studio. Pure inconferente sarebbe il fatto che B._ non emettesse fatture destinate alla clientela finale, ritenuto che non era nemmeno legittimato a farlo in quanto non aveva nessun rapporto contrattuale con i clienti. Egli non possedeva un rischio d'incasso verso il cliente finale, ma sopportava per contro un rischio imprenditoriale verso il ricorrente, nell'evenienza che questi non gli saldasse la fattura, malgrado avesse incassato dal proprio cliente l'onorario.
4.3 Le argomentazioni dell'insorgente sono speciose. Emerge in effetti dal giudizio cantonale che le conclusioni dei primi giudici sono fondate su un accertamento completo dei fatti e che non è stato commesso nessun abuso del potere di apprezzamento.
4.3.1 Ad un attento esame della documentazione agli atti si rileva infatti che B._ aveva sì lo studio a M._, in Via P._, ma emerge pure che al medesimo indirizzo vi è anche un ufficio del ricorrente. Nessun riscontro oggettivo trova inoltre l'asserzione dello studio ricorrente secondo cui B._ si assumesse le spese di locazione, agli atti mancando qualsivoglia documento probatorio in tal senso e la censura esaurendosi di conseguenza in puro parlato. L'insorgente avrebbe potuto facilmente dimostrare il fondamento delle sue allegazioni - se solo avesse agito con la diligenza richiesta dal dovere di collaborazione delle parti, atteso che siffatto dovere processuale comprende in particolare l'obbligo delle parti di apportare, ove ciò fosse ragionevolmente esigibile, le prove necessarie, avuto riguardo alla natura della disputa e ai fatti invocati, perché altrimenti rischiano di dover sopportare le conseguenza della carenza di prove (<ref-ruling> consid. 2 con riferimenti) - ad esempio producendo il contratto di locazione a suo nome come pure le ricevute dei versamenti effettuati da B._. Non basta difatti il riassunto contabile, allestito peraltro unilateralmente dall'interessato e privo dei riscontri oggettivi necessari, in cui viene dichiarata una spesa annua per "affitto" di fr. 4000.- per il 1998, di fr. 4500.- per il 1999 e di fr. 5000.- per il 2000, per provare in giudizio che tale spesa fosse stata assunta da B._.
4.3.2 È corretto quanto sostiene il ricorrente, ossia che B._ fatturasse le spese di trasferta, ma è pure vero che fatturasse anche altre spese del tutto inabituali nell'ipotesi che operasse come indipendente, quali ad esempio: fr. 79.- per "viva voce", fr. 907.40 per diversi componenti di PC e per "cavalletti x tavoli", fr. 447.- per viaggio, fr. 363.50 per scaffali, fr. 45.80 per cassette zip, fr. 125.- per programmi (presumibilmente per PC), fr. 281.60 per CD-ROM, per riparazione stampante e per tavoli + cavalletti, fr. 435.10 per ZIP 100 MB, per dischetti ZIP, per installazione Windows 2000 e per una carica batterie, fr. 264.- per cavo stampante e istallazione rete + scheda e, infine, fr. 328.40 per pila e per batteria DAT.
4.3.3 È pure vero che B._, oltre all'attività lavorativa per lo Studio ricorrente, avesse anche altri clienti, ma per sua stessa ammissione questa ulteriore attività lo occupava nella misura del 40%, pur senza indicare con la necessaria precisione il periodo di riferimento di siffatta indicazione numerica.
4.4 Ora, tenendo conto anche delle risposte alle domane formulate dalla Corte cantonale a B._ in relazione ai suoi rapporti con lo studio d'ingegneria X._ SA, emerge con sufficiente chiarezza come egli fosse un dipendente della società già per il fatto che avesse la possibilità di usufruire, come e quando volesse, sia dei locali che delle attrezzature dello studio ricorrente. Infatti, sempre a suo dire, a dipendenza di dove svolgeva il lavoro, utilizzava i mezzi dello studio d'ingegneria oppure quelli propri. Inoltre il lavoro veniva svolto in parte nel proprio studio, in parte presso lo studio X._ SA, ed egli poteva organizzarsi come voleva a condizione di concludere il lavoro nei termini prescritti, ritenuto altresì che a volte si presentava come rappresentante dello studio d'ingegneria.
4.5 In conclusione, i diversi elementi del caso concreto indicano in modo concorde e convincente che si realizza, in materia di obbligo contributivo alle assicurazioni sociali, un rapporto di dipendenza di B._ nei confronti dello studio ricorrente anche se limitato dal profilo temporale e da quello organizzativo, considerato che, contrariamente a quanto sostenuto nella tesi ricorsuale, malgrado l'interessato potesse gestire la sua attività con una certa libertà quanto all'impiego del tempo e all'organizzazione, non si era assunto alcun rischio aziendale ed economico, nemmeno quelli di portata ridotta. Infatti i costi sostenuti per i diversi acquisti (cfr. consid. 4.3.2) sono stati fatturati allo studio d'ingegneria X._ SA, che ha sempre provveduto al relativo pagamento. Nemmeno risulta provato che fosse B._ a pagare l'assicurazione responsabilità civile, così come il fatto che egli dovesse sopportare un rischio imprenditoriale verso il ricorrente nell'ipotesi che fossero venuti meno i pagamenti delle fatture emesse al cliente dello studio d'ingegneria X._ SA.
4.6 L'allegazione secondo cui sarebbe stata lesa la buona fede del ricorrente per il fatto che, prima di iniziare la collaborazione con B._, aveva accertato come quest'ultimo fosse affiliato alla Cassa quale indipendente, è ininfluente ai fini del presente giudizio. Infatti se l'assicurato esercita simultaneamente più attività lavorative, come nel caso di specie, si deve esaminare per ogni attività se il salario percepito deriva da un'attività indipendente o dipendente, motivo per cui è possibile che la stessa persona sia considerata simultaneamente come salariato e lavoratore indipendente, scorporandone le componenti (Greber/Duc/Scartazzini, Commentaire des articles 1 à 16 LAVS, Basilea 1997, note 118-120 ad art. 5 e riferimenti ivi citati).
Lo scopo dell'affiliazione ad una cassa è quello di assicurare una persona che esercita un'attività lucrativa e non quello di qualificarne in modo definitivo lo statuto professionale. Come il Tribunale federale delle assicurazioni ha già avuto modo di stabilire, la qualifica di un assicurato quale dipendente o indipendente non dipende solo dalla formalità dell'affiliazione del soggetto interessato in una o nell'altra categoria. Infatti, solo la natura di un'attività lavorativa, considerata nell'ambito dei rapporti economici e di lavoro, è determinante ai fini della qualifica (cfr. <ref-ruling> consid. 2). Nel caso di specie, si è visto che B._ presentava sia caratteristiche di attività dipendente che indipendente in mandati propri.
Lo scopo dell'affiliazione ad una cassa è quello di assicurare una persona che esercita un'attività lucrativa e non quello di qualificarne in modo definitivo lo statuto professionale. Come il Tribunale federale delle assicurazioni ha già avuto modo di stabilire, la qualifica di un assicurato quale dipendente o indipendente non dipende solo dalla formalità dell'affiliazione del soggetto interessato in una o nell'altra categoria. Infatti, solo la natura di un'attività lavorativa, considerata nell'ambito dei rapporti economici e di lavoro, è determinante ai fini della qualifica (cfr. <ref-ruling> consid. 2). Nel caso di specie, si è visto che B._ presentava sia caratteristiche di attività dipendente che indipendente in mandati propri.
5. Dato quanto precede, la pronuncia cantonale querelata merita tutela.
5. Dato quanto precede, la pronuncia cantonale querelata merita tutela.
6. Non trattandosi in concreto di una lite avente per oggetto l'assegnazione o il rifiuto di prestazioni assicurative, la procedura non è gratuita (art. 134 OG a contrario). Le spese processuali, che seguono la soccombenza, devono pertanto essere messe a carico dello studio d'ingegneria ricorrente (art. 135 in relazione con l'art. 156 cpv. 1 OG).

Per questi motivi, il Tribunale federale delle assicurazioni pronuncia:
Per questi motivi, il Tribunale federale delle assicurazioni pronuncia:
1. In quanto ricevibile, il ricorso di diritto amministrativo è respinto.
1. In quanto ricevibile, il ricorso di diritto amministrativo è respinto.
2. Le spese giudiziarie, fissate in fr. 1700.-, sono poste a carico del ricorrente e saranno compensate con la garanzia prestata da quest'ultimo.
2. Le spese giudiziarie, fissate in fr. 1700.-, sono poste a carico del ricorrente e saranno compensate con la garanzia prestata da quest'ultimo.
3. La presente sentenza sarà intimata alle parti, al Tribunale cantonale delle assicurazioni, Lugano, all'Ufficio federale delle assicurazioni sociali, nonché a B._.